我注意到处理List Adapter notifyDatasetChanged()
的两种模式。我想知道两者有什么区别,如果一个比另一个好。
第一
在数据集的Activity / Fragment中保存一个局部变量。
private List<Movie> movieList;
private SwipeListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
movieList = new ArrayList<>();
adapter = new SwipeListAdapter(this, movieList);
然后当局部变量发生变化时,在Activity / Fragment中调用它:
adapter.notifyDataSetChanged();
第二
将空DatasetSet
数组传递给片段/活动中的适配器。
EmployeeAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mAdapter = new EmployeeAdapter(this, new ArrayList<Employee>());
ListView employeeListView = (ListView) findViewById(R.id.employees);
employeeListView.setAdapter(mAdapter);
}
当修改或检索数据时,请调用:
mAdapter.setEmployees(data);
代表Adapter
类本身中的此方法:
public void setEmployees(List<Employee> data) {
employees.addAll(data);
notifyDataSetChanged();
}
答案 0 :(得分:1)
第二个选项可能很好,因为它封装了如何正确地将项添加到适配器的逻辑。如果您在多个地方执行此操作,您不会忘记在更新数据后调用ArrayAdapter
作为示例。
然而,还有第三种选择。您可以直接在notifyDataSetChanged()
上添加和删除项目,默认情况下,这会在内部调用ArrayAdapter
。
notifyDataSetChanged()
有以下方法来修改其元素,只要您不调用setNotifyOnChange(false)
,调用这些方法就会在内部调用addAll(Collection<? extends T> collection)
addAll(T ... items)
insert(T object, int index)
remove(T object)
clear()
。
setEmployees()
因此,对于第二个示例,您实际上不需要mAdapter.addAll(data)
方法{{1}}。