我在RecyclerView中遇到了Android SortedList的问题,主要是使用remove方法:
public void replaceAll(List userFertList,List defaultFertList){
restartIndexes(userFertList,defaultFertList);
mComparator.swapLists(Utils.fertiliserListToNameList(userFertList));
List<Fertiliser> combinedList = Utils.combineFertLists(userFertList, defaultFertList);
mSortedList.beginBatchedUpdates();
for (int i = mSortedList.size() -1; i > -1 ; i--) {
final Fertiliser fertiliser = mSortedList.get(i);
if(!combinedList.contains(fertiliser)){
if(!mSortedList.remove(fertiliser)){
throw new RuntimeException();
};
}
}
mSortedList.addAll(combinedList);
mSortedList.endBatchedUpdates();
}
过滤列表时执行上述代码。将删除新列表中不存在的所有对象。但是,删除对象的调用有时会失败。我知道该对象存在,因为它取自SortedList本身。
我的研究暗示我的比较器比较方法存在问题:
@Override
public int compare(Fertiliser fertiliser, Fertiliser t1) {
if(fertiliser == t1){
return 0;
}
if(mUserFertNames.contains(fertiliser.getName()) != mUserFertNames.contains(t1.getName())){
return mUserFertNames.contains(fertiliser.getName()) ? -1 : 1;
} else {
return fertiliser.getName().compareToIgnoreCase(t1.getName());
}
}
我按两个标准排序(一个检查对象是否存在于列表和名称中)。
所以我的想法是,因为SortedList使用Comparator来定位元素,我的Comparator会给出错误的结果,而列表找不到该项: SortedList中的被调用方法:
private int findIndexOf(T item, T[] mData, int left, int right, int reason) {
while (left < right) {
final int middle = (left + right) / 2;
T myItem = mData[middle];
final int cmp = mCallback.compare(myItem, item);
if (cmp < 0) {
left = middle + 1;
} else if (cmp == 0) {
if (mCallback.areItemsTheSame(myItem, item)) {
return middle;
} else {
int exact = linearEqualitySearch(item, middle, left, right);
if (reason == INSERTION) {
return exact == INVALID_POSITION ? middle : exact;
} else {
return exact;
}
}
} else {
right = middle;
}
}
return reason == INSERTION ? left : INVALID_POSITION;
}
然而,我没有找到解决方案。你能救我吗?
P.S。当我检查错误时,两个对象都不在列表中(因此它们仅通过名称进行比较)。