androidx.RecyclerView ListAdapter非常慢

时间:2019-03-15 19:50:58

标签: android android-recyclerview listadapter

我将ListAdapter与RecyclerView一起使用,在某些情况下,该应用变得非常慢-它冻结了10秒钟,其中包含1000项物品。

情况是,首先我提交了一个包含1000个项目的列表(首先按预期的速度提交了它),然后又再次提交了相同的列表,但是排序方式不同。

通过大量的调试,我终于发现ListAdapter触发了notifyItemRangeChanged(0, 999),因此基本上是完整列表。我在其他地方(herehere)读到,不应这样做,因为这会使RecyclerView变慢-显然是对的-但是,我不能影响ListAdapter的行为。 / p>

有人对此有解决方案吗?我不想再次删除ListAdapter,因为对于大多数其他用例而言,它很方便快捷,可以自动执行各种动画等操作。

编辑-一些代码

代码没什么花哨的,基本上就是这样:

RecyclerView mListView;
EnryListAdapter mEntryListAdapter; // <-- extends ListAdapter<Entry, VH>
...
    mEntryListAdapter = new EntryListAdapter();
    mListView.setAdapter(mEntryListAdapter);
    mListView.setLayoutManager(new LinearLayoutManager(this));
    mListView.setHasFixedSize(true);
    ((DefaultItemAnimator) mListView.getItemAnimator()).setSupportsChangeAnimations(false);

    List<Entry> entryList = getEntryList(); // <-- list with 1000 entries

    mEntryListAdapter.submitList(entryList); // <-- first submit is fast

    entryList = getDifferentlySortedEntryList(); // <-- list with same entries, sorted differently

    mEntryListAdapter.submitList(entryList); // <-- freezes app for over 10 seconds

1 个答案:

答案 0 :(得分:2)

最后,我发现这是我自己的错误

<HashRouter/>的实现中,我进行了以下检查:

DiffUtil.ItemCallback<Entry>#areContentsTheSame

其中oldItem.flags == newItem.flags 首先是Entry.flags,但后来在上,我将其更改为类的实例,而没有更改此比较。由于实例不是相同的对象,因此这种比较始终导致long。替换为

false

解决了该问题。