Android ListView - adapter.notifyDataSetChanged和使用新适配器之间的区别

时间:2014-06-09 15:10:17

标签: android android-listview listview-adapter

我的问题是基于这篇文章。

Android. How does notifyDataSetChanged() method and ListViews work?

我已阅读各种文章,要刷新listView,您必须调用notifyDataSetChanged()而不是listView.setAdapter(new Adapter(....));,因为第二种方法成本太高而影响性能

上述问题的答案表明,adapter.notifyDataSetChanged()会影响屏幕上当前可见的观看次数。因此,getView()的调用次数与当前显示的项目数相同。

但是,在将新适配器分配给listView时,getView()的调用次数也相同。

那么调用adapter.notifyDataSetChanged()listView.setAdapter(new Adapter(....));之间的区别是什么?

2 个答案:

答案 0 :(得分:3)

当您致电notifyDataSetChanged()时,getView()的呼叫次数相同。但是,由于适配器是相同的,因此可以重用这些视图(即传递为convertView)。

在提供新适配器时无法完成,因为ListView无法确定新适配器是否使用相同的布局。因此清理回收器,并且必须从头开始创建所有行(这比重用它们要昂贵得多)。

(如果忽略提供的convertView并且始终创建/扩充新视图,则此性能点没有实际意义 - 但无论如何这都是个坏主意。)

答案 1 :(得分:0)

setAdapter()将清除用于保存为convertView的废料堆,它还将设置一个新的适配器,然后它将requestLayout()。

然而,notifyDataSetChanged()只是requestLayout()。所以废料堆仍然存在,并且当getView()发生时,如果废料堆包含它,则convertView不会为空,因此不需要膨胀。

因此,当数据发生变化时,调用notifyDataSetChanged()而不是setAdapter()会更有效。