问题描述
在 ===
方法中使用参考比较器 areItemsTheSame
检查项目是否相同是个好主意吗?
例如:
class PhotoDiffCallback : DiffUtil.ItemCallback<Photo>() {
override fun areItemsTheSame(oldItem: Photo,newItem: Photo) = oldItem === newItem
override fun areContentsTheSame(oldItem: Photo,newItem: Photo) = oldItem == newItem
}
解决方法
areItemsTheSame
应该只比较项目 ID 之类的东西,以便 diff 可以继续运行 areContentsTheSame
并查看代表同一项目的新旧对象之间是否有任何变化。
areItemsTheSame
中的引用相等意味着项目是不可变的,它们的内容永远不会改变(areContentsTheSame
将始终返回 true
),即使您为相同的 id/ 创建新的 Photo
url 它将被视为不同的项目,这是错误的。
还有一个大问题,就是这样做,您实际上被迫维护一份对您拥有的任何项目的硬引用列表,并在更新之间不断复制/修改它。