什么更贵?每次数据更改或更新现有ArrayAdapter时都要创建新的ArrayAdapter?

时间:2014-03-05 17:53:46

标签: android listview android-listview android-arrayadapter

要更新Listview,我们可以执行以下两项操作:

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

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

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

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

那么哪种方法更贵?

2 个答案:

答案 0 :(得分:2)

你这样做的方式,第二个肯定更贵。 ArrayAdapternotifyDataSetChanged()内部以及clear()内部调用add()。您可以将其更改为

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

但即使你这样,两个调用都包含一个同步块,这使得它们变慢。所以即使你在第一种方法中创建一个新的ArrayAdapter,我会说它更快。

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

答案 1 :(得分:2)

我对接受的答案最终结论感到满意。虽然SimonSays对迭代提出了有效的观点并添加了......但是设置新的适配器时他会发现很多,但他无法识别。这使得很难说它是否真的比每种方法的建议更好。

设置新适配器将导致ListView清除其所有已回收的视图。它还必须重新测量所有新视图...这导致getView()被调用3-4次,每个项目的几个位置......如果不是所有位置。 (随平台而变化)。因此,即使添加了同步块,您也可能会看到调用getView方法的次数少得多,并且可能会使用循环视图。

基本上,了解哪个更好很难并且很大程度上取决于用例。我投票坚持使用for ...每种方法只是为了更好的可读性。