1

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

安卓。notifyDataSetChanged() 方法和 ListViews 是如何工作的?

我在各种文章中读到刷新你必须调用的 listViewnotifyDataSetChanged() 而不是listView.setAdapter(new Adapter(....));因为第二种方法成本太高并且影响性能

上述问题的答案表明,这adapter.notifyDataSetChanged()会影响当前在屏幕上可见的视图。sogetView()被调用的次数与当前显示的项目数一样多。

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

adapter.notifyDataSetChanged()那么 call和 和有什么区别listView.setAdapter(new Adapter(....));

4

2 回答 2

3

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

提供新适配器时无法做到这一点,因为ListView无法确定新适配器使用相同的布局。所以回收器被清除了,所有的行都必须从头开始创建(这比重用它们要昂贵得多)。

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

于 2014-06-09T15:23:20.380 回答
1

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

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

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

于 2015-08-27T02:17:16.070 回答