如果我有ListView
CustomAdapter
并且让我说我有这个refresh()
方法用新结果刷新列表,那么我应该:
初始化时致电new CustomAdapter(...)
,每次拨打refresh()
时,我都会使用adapter.clear()
和adapter.add(...)
每次拨打new CustomAdapter(...)
refresh()
醇>
基本上,我问,每次加载新结果时重新创建适配器是否更好,或者更好地清除现有适配器中的结果并将整个列表添加到其中?
答案 0 :(得分:4)
我认为如果您按照预期使用适配器,那么您将更新适配器的数据并在其上调用notifyDataSetChanged()
。
如果您查看ArrayAdapter之类的API,它会有多种方法,例如clear()
,add()
,addAll()
,notifyDataSetChanged()
等等是否指导您使用API。
通过使用这些方法,它不仅可以使您的代码符合其预期用途,还可以让您更容易理解并熟悉其他尝试理解您的代码的人。
基本上,我只会重新创建适配器作为最后的手段。
答案 1 :(得分:2)
最好在原始适配器上调用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()
。