在更新数据时,使用 DiffUtil 工具类来计算新旧数据集之间的差异,从而只更新有变化的数据项,而不是直接替换整个数据集。这样做可以避免 RecyclerView 加载整个数据集并移动数据项,提高列表的性能。以下是一个使用 DiffUtil 的示例:
- 创建 DiffUtil 回调类来计算差异:
class MyDiffCallback(private val oldList: List<MyItem>, private val newList: List<MyItem>) : DiffUtil.Callback() {
override fun getOldListSize() = oldList.size
override fun getNewListSize() = newList.size
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) =
oldList[oldItemPosition].id == newList[newItemPosition].id
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) =
oldList[oldItemPosition] == newList[newItemPosition]
}
- 在 ListAdapter 的 submitList() 方法中使用 DiffUtil 计算新旧数据集之间的差异:
class MyListAdapter : ListAdapter<MyItem, MyViewHolder>(MyDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
// ...
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
// ...
}
fun updateData(newList: List<MyItem>) {
val diffResult = DiffUtil.calculateDiff(MyDiffCallback(currentList, newList))
submitList(newList)
diffResult.dispatchUpdatesTo(this)
}
}
- 在更新数据时调用 ListAdapter 的 updateData() 方法:
val myListAdapter = MyListAdapter()
val newData = listOf(MyItem(1, "Updated data"), MyItem(2, "Original data"), MyItem(3, "Original data"))
myListAdapter.updateData(newData)