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

问题描述

=== 方法中使用参考比较器 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 它将被视为不同的项目,这是错误的。

还有一个大问题,就是这样做,您实际上被迫维护一份对您拥有的任何项目的硬引用列表,并在更新之间不断复制/修改它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...