DiffUtil.ItemCallback 使用参考比较器检查项目是否相同

DiffUtil.ItemCallback using reference comparator to check if items are the same

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 将始终 return true),即使您创建新的 Photo 对于相同的 id/url 它将被认为是错误的不同项目。

这样做还有一个很大的问题,那就是您实际上被迫维护一个硬引用列表,以对您拥有的任何项目进行硬引用,并在更新之间保留copying/modifying它。