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

时间:2014-07-19 01:45:19

标签: android listview android-adapter

如果我有ListView CustomAdapter并且让我说我有这个refresh()方法用新结果刷新列表,那么我应该:

  1. 初始化时致电new CustomAdapter(...),每次拨打refresh()时,我都会使用adapter.clear()adapter.add(...)

  2. 每次拨打new CustomAdapter(...)

  3. 时,请致电refresh()

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

2 个答案:

答案 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()