【问题标题】:RecyclerView Adapter's notifyItemRangeChanged is slow?RecyclerView Adapter 的 notifyItemRangeChanged 很慢?
【发布时间】:2019-09-11 08:33:23
【问题描述】:

我正在尝试更新我的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 每个大约需要 0-2 毫秒,并且根据手机大小显示大约 5-10 个项目。 onBindViewHolder 本身看起来执行得相当快,但是所有 onBindViewHolder 依次完成执行的时间却很慢。完成 14 个 onBindViewHolders 需要 0.7 秒。 onBindViewHolder 调用之间存在延迟。

【问题讨论】:

  • onBindViewHolder 执行每个项目平均需要多长时间?试过Log.d两个System.currentTimeMillis()的区别?
  • 屏幕上一次实际显示多少项?
  • @pskink onBindViewHolder 每个大约需要 0-2 毫秒,根据手机大小显示大约 5-10 个项目。 onBindViewHolder 本身看起来执行得相当快,但是所有 onBindViewHolder 依次完成执行的时间却很慢。完成 14 个 onBindViewHolders 需要 0.7 秒。 onBindViewHolder 调用之间存在延迟。
  • ".. but the time for all onBindViewHolder to finish ..." - 那么onBindViewHolder 被调用了多少次?用什么positions?
  • @pskink 它绑定 pos 7-13 然后 0-6

标签: java android android-recyclerview


【解决方案1】:

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

现在拨打recyclerView.setItemAnimator(null) 让通话变得快速而迅速。缺点是我现在失去了动画... =/

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我想避免使用这个,因为这种方法会使整个 RecyclerView 闪烁,我想避免这样做。我想使用 notifyItemRangeChanged 因为它会有一些不错的动画。但是我刚刚发现它这么慢的原因是因为 notifyItemRangeChanged 导致太多动画同时运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多