在我的 RecyclewView 的适配器中,我使用 DiffUtils 仅更新那些被修改的项目。在执行此操作时,我注意到 ImageViews 在每次更新时都会闪烁,并且在调试时我发现 onCreateViewHolder
每次更新数据时都会调用适配器的方法,因此不会像应有的那样重用视图持有者。当我摆脱 DiffUtil 并使用简单的notifyDataSetChanged
闪烁消失时。那么为什么要重新创建那些 ViewHolders,我该如何解决呢?
这是我的 DiffUtil 回调:
class MyDiffUtilCallback(val newList: List<Item>, val oldList: List<Item>) : DiffUtil.Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return newList[newItemPosition].id == oldList[oldItemPosition].id
}
override fun getOldListSize(): Int = oldList.size
override fun getNewListSize(): Int = newList.size
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return newList[newItemPosition] == oldList[oldItemPosition]
}
}
以及我如何更新我的适配器:
fun updateItems(items: List<Item>) {
val diff = DiffUtil.calculateDiff(MyDiffUtilCallback(items, this.items))
this.items = items
diff.dispatchUpdatesTo(this)
}
编辑:
我进一步研究了这个问题,并注意到在使用时也重新创建了视图notifyDataSetChanged
,我一直认为在更新期间视图被重用,但我想情况并非如此。无论如何,只有在使用 DiffUtil 而不是时,图像闪烁仍然可见notifyDataSetChanged
,我不知道为什么