在不同大小的列表上进行DiffUtil回调

Nsn*_*nik 6 android arraylist android-recyclerview

我正在使用自定义实现DiffUtil回调比较两个列表以查找它们之间的差异,但是这两个列表具有不同的大小,并且当我在比较的'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));
}
Run Code Online (Sandbox Code Playgroud)

例如:

(旧)列表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”

小智 1

如果您的适配器设置为setHasStableIds(true),则位置不可靠,您需要重写该getItemId()方法。