我报名参加金石方案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布局如下,当前只想改写顶部内容
:
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的某一部分内容怎么完成独自改写,没什么难度,咱们知道并学会运用即可 。