Android SortedList删除方法是跳过项目

时间:2018-03-15 19:31:31

标签: android android-recyclerview comparator sortedlist

我在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。当我检查错误时,两个对象都不在列表中(因此它们仅通过名称进行比较)。

0 个答案:

没有答案