我正在尝试更新RecyclerView
中的一系列项目。基本上,我在列表中的每个项目之间切换了可见/消失视图。我正在尝试使用notifyItemRangeChanged
,但是它非常慢,并且UI滞后明显。我的onBindViewHolder
也不是很复杂。我应该在后台线程中为此做些什么吗?
// Called in Activity
mListAdapter.notifyItemRangeChanged(0, mPlayerlist.size());
// My adapter's onBindViewHolder method
@Override
public void onBindViewHolder(@NonNull PlayerHolder holder, int position) {
Log.d("onBind", position + "");
Player player = mPlayerList.get(position);
if (player.isCheckboxVisible()) {
holder.checkbox.setVisibility(View.VISIBLE);
if (player.isIncluded()) {
holder.checkbox.setChecked(true);
} else {
holder.checkbox.setChecked(false);
}
} else {
holder.checkbox.setVisibility(View.GONE);
}
holder.playerNameText.setText(player.getName());
}
我进行了一些测试,获得了更多信息:onBindViewHolder每次大约需要2到2毫秒,并且根据手机的大小显示大约5到10项。 onBindViewHolder本身看起来执行起来非常快,但是所有onBindViewHolder连续完成执行的时间很慢。 14个onBindViewHolders用了0.7秒完成。 onBindViewHolder调用之间存在延迟。
答案 0 :(得分:0)
我认为您可以使用mListAdapter.notifyDataSetChanged();
答案 1 :(得分:0)
我刚刚弄清楚它这么慢的原因是因为notifyItemRangeChanged导致太多的项目更改动画同时运行。
呼叫recyclerView.setItemAnimator(null)
使呼叫现在变得快速而迅速。缺点是我现在失去了动画... = /