实际上,DiffUtil算法还是耗时间的,如果数据更多,估计时间也会随之增多,所以,官方推荐开启个异步线程来处理计算,之后分发操作再切换UI线程进行数据的更新操作
ListAdapter使用ListAdapter其实就是对上面的DiffUtil的一个封装类,以往,我们的Adapter都是继承了RecyclerView.Adapter,并在其中写了个List去装载数据,十分麻烦
ListAdapter里面维护着线程池并且还会为我们将视图修改操作移到主线程,这样我们就可以很方便的使用DiffUtil了如果我们将此Adapter替换成继承与ListAdapter,那么都不需要我们在类中写上个List,代码示例如下:
class RvAdapter() : ListAdapter<Person, RvAdapter.ViewHolder>(diffCallback) { companion object { val diffCallback = object : DiffUtil.ItemCallback<Person>() { override fun areItemsTheSame(oldItem: Person, newItem: Person): Boolean { return oldItem.id == newItem.id } override fun areContentsTheSame(oldItem: Person, newItem: Person): Boolean { //如果新数据和旧数据的名称和年龄相同,则视为两个item的内容相同 return oldItem.age == newItem.age && oldItem.name == newItem.name } } } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var tvAge: TextView = itemView.findViewById(R.id.tvAge) var tvName: TextView = itemView.findViewById(R.id.tvUserName) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val itemView = View.inflate(parent.context, R.layout.rv_item_person, null) return ViewHolder(itemView) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = getItem(position) holder.tvName.text = item.name holder.tvAge.text = item.age.toString() }}ListAdapter<T,ViewHolder>第一个泛型即为你的数据实体类,第二个参数为ViewHolder类
注意: 之后的数据增删改查都需要调用adapter提供的submitList()方法即可
val oldList = adapter.currentListval newList = oldList.map { it }.toMutableList()newList.removeAt(10)//下标2加个新数据newList.add(2, Person(90, "我的", 72))adapter.submitList(list)效果:
![Android RecyclerView使用ListAdapter高效刷新数据](https://m.360buyimg.com/jdcms/jfs/t1/72029/40/22516/37422/635517e9E24230590/bcdea340a0281e50.gif)
文章插图
参考
- 别再notifyDataSetChanged()了!使用DiffUtil让你的RecyclerView更加丝滑 - 掘金
经验总结扩展阅读
- 使用 Windows Core Audio APs 进行 Loopback Recording 并生成 WAV 文件
- 飞利浦吸尘器堵塞不吸了怎么办 吸尘器使用注意事项
- 4 .NET 6学习笔记——如何在.NET 6的Desktop App中使用Windows Runtime API
- 使用react+redux实现弹出框案例
- 珂润面霜适合油皮使用吗?
- 铸工胶使用范围
- Android掌控WiFi不完全指南
- 你真的会使用Typora吗?
- 除菌液怎么使用
- 西班牙安瓶使用方法是什么?