在原始适配器上调用notifyDataSetChanged()绝对比设置新适配器更好.
原因是性能:ListView使用视图回收来避免在滚动时创建新项目视图.设置新适配器时,将丢弃这些循环视图,这意味着必须从头开始重新创建它们以进行下一个布局过程.看看code of ListView.setAdapter():
@Override
public void setAdapter(ListAdapter adapter) {
if (mAdapter != null && mDataSetObserver != null) {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
resetList();
mRecycler.clear();
...
这是完全逻辑行为,因为ListView假定新适配器将使用的视图与先前适配器返回的视图不兼容(在任何情况下,它都不能假定它们将兼容).所以他们被扔掉了.
因此,如果每次都设置一个新适配器,则会产生不必要的性能成本(重新创建所有当前视图).
此外,如果您编写了自定义适配器,则不必单独调用add()(例如,使用ArrayAdapter).您可以使用新的内部数据集替换内部数据集,然后调用notifyDataSetChanged().