如果我有一个ListView
与,CustomAdapter
并说我有这种refresh()
方法可以用新结果刷新列表,那么我应该:
呼叫new CustomAdapter(...)
初始化时,我每次通话refresh()
,我使用adapter.clear()
和adapter.add(...)
new CustomAdapter(...)
每次打电话都打电话refresh()
我问的是,基本上是在每次加载新结果时重新创建适配器会更好还是在现有适配器中清除结果并向其中添加整个列表更好?
绝对最好调用notifyDataSetChanged()
原始适配器而不是设置新适配器。
原因是性能:ListView
使用视图回收避免滚动时创建新的项目视图。设置新适配器时,这些回收的视图将被丢弃,这意味着必须从头开始重新创建它们以进行下一个布局遍历。看一下以下代码ListView.setAdapter()
:
@Override
public void setAdapter(ListAdapter adapter) {
if (mAdapter != null && mDataSetObserver != null) {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
resetList();
mRecycler.clear();
...
这完全是逻辑行为,因为ListView
假定新适配器将使用的视图与前一个适配器返回的视图不兼容(无论如何,它不能假定它们将兼容)。所以他们被扔掉了。
因此,如果每次都设置一个新的适配器,则会导致不必要的性能成本(重新创建所有当前视图)。
另外,如果您编写了自定义适配器,则不必add()
单独调用(例如ArrayAdapter
)。您可以将内部数据收集替换为新的,notifyDataSetChanged()
然后再调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句