要更新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();
那么哪种方法更贵?
答案 0 :(得分:2)
你这样做的方式,第二个肯定更贵。 ArrayAdapter
在notifyDataSetChanged()
内部以及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 ...每种方法只是为了更好的可读性。