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

时间:2016-08-23 11:07:26

标签: android android-recyclerview adapter android-support-library notifydatasetchanged

由于一些错误修复,我不得不将支持库从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);
...

在适配器中我有

public void updateList(List<MyItems> items) {
    this.mDataset = items;
    notifyDataSetChanged();
}

它没有延迟工作,并且使用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;
    }
}

2 个答案:

答案 0 :(得分:2)

看来我的问题与此处RecyclerView 23.2.x height=0dp causes onBind called for all items and scrollToPosition not working

完全相同

正如它在支持库23.2+及更高版本中所述,如果设置layout_height =“0dp”,则会立即为列表中的所有项目调用onBindViewHolder(),对于包含400-600项目的列表,它会创建性能问题。

然而,与上面链接中的建议解决方案相反,更新以支持库23.3.0(或任何更高版本)并未解决此问题。

要解决这个问题,我使用layout_height =“1dp”而不是layout_height =“0dp”虽然对我来说仍然不清楚为什么这种黑客行为。或者更具体地说,为什么layout_height =“0dp”不能正常工作。

答案 1 :(得分:0)

我有一个类似的问题,当我的recyclerView更新其中的大量数据时(调用notifyDataSetChanged时),它导致我的应用程序冻结了几秒钟。 这是因为我的recyclerView嵌套在NestedScrollView中。当我在布局中删除NestedScrollView时,此问题已解决。