DiffUtil.Callback中有两个要覆盖的函数:
areContentsTheSame(int oldItemPosition, int newItemPosition)
getChangePayload(int oldItemPosition, int newItemPosition)
[我知道前者会检查内容是否已更改,我想直接通过使用'=='来比较它们是否是同一实例,因为我相信我的商品在更新后将是一个新实例。但是相同的比较在后一个函数中给出了不同的结果。这是代码:
public class MyDiffUtilCallback extends DiffUtil.Callback {
List<App> mNewList;
List<App> mOldList;
public MyDiffUtilCallback(List<App> newList, List<App> oldList) {
mNewList = newList;
mOldList = oldList;
}
@Override
public int getOldListSize() {
return mOldList.size();
}
@Override
public int getNewListSize() {
return mNewList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return mNewList.get(newItemPosition).id == mOldList.get(oldItemPosition).id;
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return mNewList.get(newItemPosition) == mOldList.get(oldItemPosition);
// This always returns false correctly whenever the item gets an update, it's working as expected
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
if (mNewList.get(newItemPosition) == mOldList.get(oldItemPosition)) {
return null; // But this is always being executed
}
return mNewList.get(newItemPosition).data; // This is never executed, why?
}
}
我不明白为什么旧项目和新项目之间的相同比较会得出不同的结果,超类会修改列表还是其他?
从Android definition:
[当areItemsTheSame(int,int)为两个项目返回true,而areContentsTheSame(int,int)为它们返回false时,DiffUtil调用此方法以获取有关更改的有效负载。
由于mNewList.get(newItemPosition) == mOldList.get(oldItemPosition)
中的getChangePayload
与areItemsTheSame
相同,并且根据定义,当getChangePayload
为真时进入areItemsTheSame
,您的测试将始终为真。
[您应该通过更详细的测试进行更改,我也发现了关于Medium的不错的文章,该文章实现了getChangePayload
。希望对您有所帮助。