我报名参加金石方案1期应战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

本篇文章主要是共享下RecyclerView中子item怎么独自改写以及子item的某一部分内容怎么完成独自改写,期望可以给你带来帮助。

单刷RecycleView的子Item

除非必要,应该尽或许防止调用notifyDataSetChanged()去改写RecyclerView列表 ,这会对性能造成影响,所以RecyclerView.Adapter还供给了一下几个办法:

private fun recycleViewRelated() {
    mAdapter.notifyItemChanged()
    mAdapter.notifyItemRangeChanged()
    mAdapter.notifyItemInserted()
    mAdapter.notifyItemRangeInserted()
    mAdapter.notifyItemRangeRemoved()
    mAdapter.notifyItemRemoved()
}
  • notifyItemXXXChanged():通知指定索引的item调用onBindViewHolder()改写界面

  • notifyItemXXXInserted():通知在指定索引处刺进item,即刺进ViewHolder,有或许复用,有或许重新调用onCreateViewHolder()创建

  • notifyItemXXXRemoved(): 通知移除指定索引的item,即移除ViewHolder,并依据状况放到咱们了解的1级mAttachedScrap缓存或3级缓存RecycledViewPool

上面的几个状况咱们依据状况调用,请注意调用上面单刷办法时,同样要确保RecyclerView数据源也进行了刺进/删去/更新操作,不然或许会引发不必要的反常。

单刷RecycleView的子Item的部分内容

有时分,某个子Item对应的布局比较复杂,且每次改写只或许会改写其间一部分,这个时分使用上面介绍的单刷就会改写到子item中不必要改写的部分,这个时分咱们可以借助payload完成单刷Item中的某一部分内容。

接下来介绍两种方法,假定当前Item布局如下,当前只想改写顶部内容

数见不鲜的RecyclerView使用技巧,你了解吗(一)?

1.普通payload方法

这个主要是借助带payload参数的notifyItemXXXRemoved/Changed/Inserted()办法+带payloads参数的onBindViewHolder()办法完成,接下来咱们来看代码实操。

咱们用1、2、3分别来标识Item的顶部、中部和底部对应布局内容,目前咱们只想改写标识为1对应的顶部内容:

mAdapter.notifyItemChanged(0, 1)

上面代码就代表着改写下标为0对应item布局的顶部内容,接下来咱们在onBindViewHolder() 中处理:

override fun onBindViewHolder(
    holder: RecyclerView.ViewHolder,
    position: Int,
    payloads: MutableList<Any>
) {
    if (payloads.isEmpty()) {
        super.onBindViewHolder(holder, position, payloads)
        return
    }
    when(payloads[0]) {
        //改写顶部内容
        1 -> {}
        //改写中部内容
        2 -> {}
        //改写底部内容
        3 -> {}
    }
}

得用带有如上payloads参数的onBindViewHolder()才干处理通过notifyItemChanged()最后一个参数传递过来的payload参数。

请注意当payloads集合参数为空时,要自动调用super.onBindViewHolder(holder, position, payloads)确保单item的全体改写。

2.ListAdapter方法

ListAdapter是基于DiffUtil完成列表中部分item改写的,具体的使用这儿不做过多介绍。

当咱们继承ListAdapter自定义一个适配器时,要传入一个DiffUtil.ItemCallback目标,这个目标有个getChangePayload()办法,这儿就是完成item中部分内容改写的关键。

private class InnerAdapter2 : ListAdapter<String, RecyclerView.ViewHolder>(object : DiffUtil.ItemCallback<String>() {
        override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
        }
        override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
        }
        override fun getChangePayload(oldItem: String, newItem: String): Any? {
            return super.getChangePayload(oldItem, newItem)
        }
    })

咱们只需要对上面的getChangePayload()办法重写,依据数据改变的规模来决定改写item的顶部、中部还是底部。

override fun getChangePayload(oldItem: String, newItem: String): Any? {
    val list = mu
    //假如数据改变会影响item顶部内容显示,则回来1改写item顶部内容
    if (oldItem != newItem) {
        return 1
    }
    //假如数据改变会影响item顶部内容显示,则回来2改写item中部内容
    if (oldItem != newItem) {
        return 2
    }
    //假如数据改变会影响item顶部内容显示,则回来3改写item底部内容
    if (oldItem != newItem) {
        return 3
    }
    return super.getChangePayload(oldItem, newItem)
}

接下来咱们在onBindViewHolder中处理就行 ,处理的方法和上面相同,这儿就再描绘。

假如咱们想要同时完成item中顶部和底部布局内容的同时改写,那就可以向onBindViewHolder()的payload中传一个集合包括1和3标识或者其他特殊标识等等,方法不限,只要能让onBindViewHolder()知道要改写顶部和底部就即可。

总结

本篇文章主要是讲解了怎么完成RecyclerView中子item怎么独自改写以及子item的某一部分内容怎么完成独自改写,没什么难度,咱们知道并学会运用即可 。