Android RecyclerView使用ListAdapter高效刷新数据( 二 )


实际上,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高效刷新数据

文章插图
参考