android - 什么更贵?每次数据更改时创建一个新的 ArrayAdapter 还是更新现有的 ArrayAdapter?

标签 android listview android-listview android-arrayadapter

要更新 ListView ,我们可以执行以下两件事:

1)创建一个新的ArrayAdapter,并在每次数据更新时将其绑定(bind)到ListView。

this.listView.setAdapter(new ArrayAdapter(getActivity(), data));

2)更新已经绑定(bind)到listview的ArrayAdapter的内容:

this.arrayadapter.clear();
for (Data item : data)
    this.arrayadapter.add(item);
this.arrayadapter.notifyDataSetChanged();

那么哪种方法更昂贵?

最佳答案

按照你的做法,第二个肯定更贵。 ArrayAdapterclear() 以及 add() 中内部调用 notifyDataSetChanged()。您可以将其更改为

this.arrayadapter.setNotifyOnChange(false);
this.arrayadapter.clear();
for (Data item : data)
    this.arrayadapter.add(item);
this.arrayadapter.setNotifyOnChange(true);
this.arrayadapter.notifyDataSetChanged();

但即使你这样做,两个调用都包含一个同步块(synchronized block),这使得它们变慢。因此,即使您在第一种方法中创建一个新的 ArrayAdapter,我也会说它更快。

您可以通过使用带有 setItems(data) 方法的自定义适配器来进一步优化它,该方法仅替换内部数据列表。

关于android - 什么更贵?每次数据更改时创建一个新的 ArrayAdapter 还是更新现有的 ArrayAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205380/

相关文章:

android - Sonar 运行器 : Unable to find file warning

android - 如何处理listview android中的复选框?

android - 为什么 ListView Items 在滚动后变得不可点击

java - 带有开关按钮的 Android ListView - 一次只有一个开关处于 Activity 状态

android - 添加新行时如何调整 ListView 的大小?

android - 我正在使用 Toast 在 ListViewItem 单击时显示,但没有显示 toast

android - 将 ListView 项目放在可见区域的中心

Android 创建日历事件

Android expandablelistview展开时无法显示最后一组

java - 如何在ListView中显示 "anchor"headerview