为什么在DiffUtil RecyclerView中需要同时使用areItemsTheSame和areContentsTheSame?我不理解,我认为只用areItemsTheSame比较数据就足够了。能否更详细地解释一下?谢谢。
尽可能简短:
areItemsTheSame
- 用于确定新旧列表之间的结构变化(添加/删除/位置更改)
areContentsTheSame
- 确定特定项是否已更新
如果列表中的对象是不可变的,则您可能没有注意到区别,可以始终从areContentsTheSame
返回true
,但当您的项目可以更新时,这很重要。
DiffUtil.ItemCallback有3个方法是有原因的。假设您正在比较两个对象:
Movie A rated at 5 stars
Movie A rated at 4 stars
在计算差异时,会进行以下调用:
areItemsTheSame
:检查两个对象是否表示相同的项目(电影A),返回trueareContentsTheSame
:检查内容是否相同(星级评分),不相同 - 返回falsegetChangePayload
:当 areContentsTheSame
返回false时调用。这是一个可选的重写方法,可以用于返回部分视图更新的载荷对象。在此示例中,它可以返回 4 (星星)。areItemsTheSame(T, T)
用于判断两个对象是否相同。如果不相同,则需要添加/删除该项。
areContentsTheSame
只有在 areItemsTheSame(T, T)
返回 true 时才会被调用。在这种情况下,该项以前是可用的,但内容已更改,因此应显示相应的更改。
getChangePayload (T oldItem, T newItem)
在 areItemsTheSame(T, T)
返回 true 并且 areContentsTheSame(T, T)
返回 false 的情况下被调用,以获取有关更改的有效负载。
DiffUtil
用于计算列表间的差异,并仅向适配器分派必要的更改。如果您的项目没有标识符或其他方式来满足areItemsTheSame
合同,则运行DiffUtil
是毫无意义的,因为它无法确定添加/删除/移动。 - Pawel