支持库从 23.1.1 更新到 23.2.1 后,RecyclerView 适配器中的 notificationDataSetChange() 变慢

Ton*_*ony 2 android adapter android-support-library notifydatasetchanged android-recyclerview

由于修复了一些错误,我必须将支持库从 23.1.1 更新到 23.2.1。然而我遇到了一个问题,在这次更新之后,调用notifyDataSetChange()需要花费很多时间并且阻塞UI。对于 10-20 个项目这样的短列表,人们无法注意到差异,但对于 400-500 个项目的列表,notifyDataSetChange() 需要 2-3 秒来执行,并且它会阻塞 UI。对于 23.1.1,我没有测量需要多长时间,但从用户体验来看,即使列表有 500-600 个项目,更新也是即时的。

代码没有任何变化,只是将支持库从 23.1.1 升级到 23.2.1。

我尝试了所有 23.2.xx、23.3.xx 和 23.4.xx 库,但都有相同的问题。我没有尝试使用支持库 24.xx.xx,因为我需要使用 23 版本

当我从网络接收 myItemList 时,我从活动异步更新适配器:

...
((MyRecyclerViewAdapter) mAdapter).updateList(myItemList);
...
Run Code Online (Sandbox Code Playgroud)

在适配器中我有

public void updateList(List<MyItems> items) {
    this.mDataset = items;
    notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

在 23.1.1 上它确实可以正常工作,没有延迟和阻塞 UI,正如我上面提到的,在 23.2.1 及更高版本上它变得很慢。我想使用23.2.1,因为引入了RecylerView的wrap_content功能。

如果有任何帮助,我们将不胜感激。

我的适配器还有:

public void onBindViewHolder(final ViewHolder holder, int position) {

    holder.itemName.setText(mDataset.get(position).getName());
    holder.itemPoints.setText(String.valueOf(mDataset.get(position).getPointsNumber()));


}

....

 public static class ViewHolder extends RecyclerView.ViewHolder {

    public final View mView;
    TextView itemName;
    TextView itemPoints;      

    public ViewHolder(View rowView) {
        super(rowView);
        itemName = (TextView)  rowView.findViewById(R.id.item_name);
        itemPoints = (TextView)  rowView.findViewById(R.id.item_points);

        mView = rowView;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

我遇到了类似的问题,我的 recyclerView 导致我的应用程序在更新大量数据时(调用 notificationDataSetChanged 时)冻结几秒钟。这是因为我的 recyclerView 嵌套在 NestedScrollView 中。当我删除布局中的 NestedScrollView 时,问题就解决了。