由于一些错误修复,我不得不将支持库从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;
}
}
答案 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时,此问题已解决。