欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android RecyclerView添加footerview详解

程序员文章站 2022-03-02 15:56:55
class footerviewadapter :recyclerview.adapter() { companion object...
class footerviewadapter :recyclerview.adapter<recyclerview.viewholder>() {

    companion object {
        const val type_footer: int = 1
        const val type_normal: int = 0
    }

    var isfooterview: boolean = false

    fun setfooterview() {
        this.isfooterview = true
        notifyiteminserted(itemcount)
    }

    fun removefooterview() {
        this.isfooterview = false
    }


    override fun getitemviewtype(position: int): int {
        return if (isfooterview && position == itemcount - 1) type_footer else type_normal
    }

    override fun oncreateviewholder(parent: viewgroup, viewtype: int): recyclerview.viewholder {
        if (viewtype == type_footer) {
            val view = layoutinflater.from(parent.context)
                .inflate(r.layout.focus_footer_view_no_line, parent, false)
            return bottomviewholder(view)
        }
        
        return 设置的其他viewholder
    }


    override fun onbindviewholder(holder: recyclerview.viewholder, position: int) {
        if (getitemviewtype(position) == type_footer) return
        你的绑定事件不用动
    }
    class bottomviewholder(view: view) : recyclerview.viewholder(view) {
    }
    
    override fun getitemcount(): int {
        return if (isfooterview && mdata.size > 0) mdata.size + 1
        else mdata.size
    }
}


1.定义viewtype的类型,一个是正常的,一个是底部view

 companion object {
        const val type_footer: int = 1
        const val type_normal: int = 0
    }
2.定义一个是否加footerview的boolean变量
(1)如果你的底部view是固定的,就不需要解析多次xml布局,直接在oncreateviewholder方法里解析一次布局。
var isfooterview: boolean = false
(2)如果你的底部布局是变化的,那这里设置的就应该是
var isfooterview: view

3.footerview相关方法

//设置footerview
fun setfooterview() {
        this.isfooterview = true
        notifyiteminserted(itemcount)
       //这个方法是通知adapter有新的item插入
    }

//移除footerview
    fun removefooterview() {
        this.isfooterview = false
    }

4.重写getitemviewtype
根据isfooterview判断是否加footerview&&item是不是最后一个来定位最后一个item,其他的viewtype都是type_normal

override fun getitemviewtype(position: int): int {
        return if (isfooterview && position == itemcount - 1) type_footer else type_normal
    }

5.itemcount
这个方法很重要,是计算有多少个item的,上面也用到了。
很简单,添加了footerview,itemcount加1

override fun getitemcount(): int {
        return if (isfooterview && mdata.size > 0) mdata.size + 1
        else mdata.size
    }

6.接下来创建一个空viewholder,当然也可以复用其他已创建的viewholder

 class bottomviewholder(view: view) : recyclerview.viewholder(view) {
    }

7.重写oncreateviewholder,根据viewtype来解析不同的布局。

 override fun oncreateviewholder(parent: viewgroup, viewtype: int): recyclerview.viewholder {
        if (viewtype == type_footer) {
            val view = layoutinflater.from(parent.context)
                .inflate(r.layout.focus_footer_view_no_line, parent, false)
            return bottomviewholder(view)
        }
        
        return 设置的其他viewholder
    }

8.重写onbindviewholder,如果viewtype为type_footer就跳过

 override fun onbindviewholder(holder: recyclerview.viewholder, position: int) {
        if (getitemviewtype(position) == type_footer) return
        你的绑定事件不用动
    }

9.最后说一下getadapterposition和getlayoutposition
建议如下:

当你需要绑定数据的时候使用holder.getadapterposition();来实时获取

当你进行点击/滑动等监听事件用holder.getlayoutposition();来获取位置

在绝大多数的时候holder.getadapterposition()和holder.getlayoutposition()是没有任何区别的,因为两者数据的不同在16ms之内

总结

到此这篇关于android recyclerview添加footerview详解的文章就介绍到这了,更多相关recyclerview添加footerview内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!