我正在使用自定义实现 DiffUtil Callback 比较两个列表以查找它们之间的差异,但这两个列表具有不同的大小,并且当我记录在“areItemsTheSame”和“areContentsTheSame”元素中比较的列表中进行比较的元素时受到元素最少的列表大小的限制,因此当在我的适配器中我调用“dispatchUpdatesTo”时,会添加新项目,但其内容与旧列表中的最后一个项目相同
这些方法的实现:
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return mOldList.get(oldItemPosition).equals(mNewList.get(newItemPosition));
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return mOldList.get(oldItemPosition).equals(mNewList.get(newItemPosition));
}
例如:
(旧)列表 A = "A","B","C","D","E","F","G","I"
(新)列表B = "A","B","C","D","E","F","G","I","K"
在记录时,我发现'areItemsTheSame'和'areContentsTheSame'仅比较元素直到“I”,因此对所有调用返回true,并且在为适配器调用dispatchUpdatesTo之后,新项目被添加到列表中,但它是“I”而不是“k” ”
所以我得到的是列表 A = "A","B","C","D","E","F","G","I","I"
如果你的适配器设置了setHasStableIds(true),位置不可靠,你需要重写getItemId方法。