我将ListAdapter
与RecyclerView一起使用,在某些情况下,该应用变得非常慢-它冻结了10秒钟,其中包含1000项物品。
情况是,首先我提交了一个包含1000个项目的列表(首先按预期的速度提交了它),然后又再次提交了相同的列表,但是排序方式不同。
通过大量的调试,我终于发现ListAdapter触发了notifyItemRangeChanged(0, 999)
,因此基本上是完整列表。我在其他地方(here和here)读到,不应这样做,因为这会使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
答案 0 :(得分:2)
最后,我发现这是我自己的错误。
在<HashRouter/>
的实现中,我进行了以下检查:
DiffUtil.ItemCallback<Entry>#areContentsTheSame
其中oldItem.flags == newItem.flags
首先是Entry.flags
,但后来在上,我将其更改为类的实例,而没有更改此比较。由于实例不是相同的对象,因此这种比较始终导致long
。替换为
false
解决了该问题。