RecyclerView中SortedList的奇怪行为

时间:2017-10-17 17:42:41

标签: android performance android-recyclerview sortedlist

我使用SortedList在一些参数上对我的数据进行排序让我们在RecyclerView中说" Date"以便在加载大量数据时提高性能。但我观察到它非常奇怪的行为。首先,lemme放了一些代码 -

mMatchesList = new SortedList<>(Matches.class, new SortedList.Callback<Matches>() {

        @Override
        public int compare(Matches o1, Matches o2) {

            int result = 0;

                try {

                    result = DateTimeOperationUtil.dateComparator("dd-MMM-yyyy", o2.MatchDate, o1.MatchDate);
                } catch (ParseException e) {
                    e.printStackTrace();
                }

            return result;
        }

        @Override
        public void onChanged(int position, int count) {

            notifyItemRangeChanged(position, count);
        }

        @Override
        public boolean areContentsTheSame(Matches oldItem, Matches newItem) {

            return oldItem.equals(newItem);
        }

        @Override
        public boolean areItemsTheSame(Matches item1, Matches item2) {

            return item1.hashCode() == item2.hashCode();
        }

        @Override
        public void onInserted(int position, int count) {

            notifyItemRangeInserted(position, count);
        }

        @Override
        public void onRemoved(int position, int count) {

            notifyItemRangeRemoved(position, count);
        }

        @Override
        public void onMoved(int fromPosition, int toPosition) {

            notifyItemMoved(fromPosition, toPosition);
        }
    });

在这里,我有一些匹配

  

我想按降序排序日期

。第一次,订单和我想要的一样但是

  

当我更改任何比赛的日期时,那应该根据   定义订单。但它没有发生,数据也没有改变   这个清单。

EDITED 我使用以下代码更新了我的列表:

if (mMatchesList.indexOf(matches) != -1)
        mMatchesList.updateItemAt(mMatchesList.indexOf(matches), matches);
  

My Matches模型类实现了equals()和hashcode()。

告诉我我做错了什么。

1 个答案:

答案 0 :(得分:0)

您尚未正确实施areItemsTheSame方法。你应该检查两个项目是否相同,即你是通过id检查(主键是否为数据库模型)或其他一些可以告诉你两个对象是否相同的方法,而不是hashCode。可以为两个不同的模型使用相同的哈希码。

阅读hashCode方法documentation.

中的第三个要点