RecyclerView的局部刷新
面试时经常被问到Android列表控件RecyclerView,无非就是深入源码与ListView进行对比,四层缓存和局部刷新。而今天的重点就是局部刷新
使用场景
我们在使用RecyclerView的局部刷新时,往往使用notify相关方法,如下
这样写,确实可以解决大部分问题,但是这种局部刷新需要我们精准的指定具体的position。这种局限性使他只能适用于小范围的内容修改。
但我们的数据往往是从livedata获取到的,难道为了实现局部刷新,还要我们自己对比list发生改变的下标吗。可能大家都不会花时间做出回报率低的优化,直接使用notifyDataSetChanged()进行全局刷新(一个字,快)。
但官方早就预判到了大家的懒惰机智,推出了DiffUtil,AsyncListDiffer,ListAdapter等局部刷新大礼包,可以自动分析oldList和newList的差异,自动实现局部刷新。
代码部分
先放代码
kotlin
private class MyListAdapter : ListAdapter<Int, MyListAdapter.MyViewHolder>(
object : DiffUtil.ItemCallback<Int>() {
override fun areItemsTheSame(oldItem: Int, newItem: Int): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: Int, newItem: Int): Boolean {
return oldItem == newItem
}
}
) {
class MyViewHolder(binding: AdapterListBinding) : RecyclerView.ViewHolder(binding.root) {
val text = binding.textView
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
AdapterListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.text.text = getItem(position).toString()
}
}
数据刷新
kotlin
adapter.submitList(listOf(1, 2, 3, 4, 5))
后续
遇到这种好工具太激动了,先放代码,正准备深入源码,随后更新