RecyclerView Adapter的notifyItemRangeChanged慢吗?

时间:2019-09-10 06:59:51

标签: java android android-recyclerview

我正在尝试更新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调用之间存在延迟。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用mListAdapter.notifyDataSetChanged();

答案 1 :(得分:0)

我刚刚弄清楚它这么慢的原因是因为notifyItemRangeChanged导致太多的项目更改动画同时运行。

呼叫recyclerView.setItemAnimator(null)使呼叫现在变得快速而迅速。缺点是我现在失去了动画... = /