我的问题是基于这篇文章。
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(....));
之间的区别是什么?
答案 0 :(得分:3)
当您致电notifyDataSetChanged()
时,getView()
的呼叫次数相同。但是,由于适配器是相同的,因此可以重用这些视图(即传递为convertView
)。
在提供新适配器时无法完成,因为ListView
无法确定新适配器是否使用相同的布局。因此清理回收器,并且必须从头开始创建所有行(这比重用它们要昂贵得多)。
(如果忽略提供的convertView
并且始终创建/扩充新视图,则此性能点没有实际意义 - 但无论如何这都是个坏主意。)
答案 1 :(得分:0)
setAdapter()将清除用于保存为convertView的废料堆,它还将设置一个新的适配器,然后它将requestLayout()。
然而,notifyDataSetChanged()只是requestLayout()。所以废料堆仍然存在,并且当getView()发生时,如果废料堆包含它,则convertView不会为空,因此不需要膨胀。
因此,当数据发生变化时,调用notifyDataSetChanged()而不是setAdapter()会更有效。