最好重新创建listview适配器或清除并重新填充?

ray*_*bay 6 android listview android-adapter

如果我有ListView一个CustomAdapter让我们说我有这个refresh()方法刷新,新的结果列表中,我应该:

  1. 呼叫new CustomAdapter(...)初始化时,每次我打电话时refresh(),我用adapter.clear()adapter.add(...)

  2. new CustomAdapter(...)每次打电话都打电话refresh()

基本上,我问,每次加载新结果时重新创建适配器是否更好,或者更好地清除现有适配器中的结果并将整个列表添加到其中?

mat*_*ash 2

notifyDataSetChanged()调用原始适配器肯定比设置新适配器更好。

原因是性能:ListView使用视图回收来避免在滚动时创建新的项目视图。当您设置新的适配器时,这些回收的视图将被丢弃,这意味着必须从头开始重新创建它们以用于下一个布局过程。看看下面的代码ListView.setAdapter()

@Override
public void setAdapter(ListAdapter adapter) {
    if (mAdapter != null && mDataSetObserver != null) {
        mAdapter.unregisterDataSetObserver(mDataSetObserver);
    }

    resetList();
    mRecycler.clear();

    ...
Run Code Online (Sandbox Code Playgroud)

这是完全合乎逻辑的行为,因为ListView假设新适配器将使用的视图与前一个适配器返回的视图不兼容(无论如何,它不能假设它们将兼容)。所以他们被扔掉了。

因此,如果每次都设置新的适配器,则会产生不必要的性能成本(重新创建所有当前视图)。

另外,如果您编写了自定义适配器,则不一定需要add()单独调用(例如,ArrayAdapter)。您只需将内部数据收集替换为新的,然后notifyDataSetChanged()再调用即可。