在 Fragment/Activity 内或直接在适配器中更新数据集

Update Dataset inside Fragment/Activity or directly in the 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 数组传递给 Fragment/Activity 中的适配器。

 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 class本身:

public void setEmployees(List<Employee> data) {
    employees.addAll(data);
    notifyDataSetChanged();
}

第二个选项可能不错,因为它封装了有关如何将项目正确添加到适配器的逻辑。如果您在多个地方执行此操作,您将不会忘记在更新数据后调用 notifyDataSetChanged() 作为示例。

不过,还有第三种选择。您可以直接在 ArrayAdapter 上添加和删除项目,默认情况下这将在内部调用 notifyDataSetChanged()

ArrayAdapter有以下方法修改其元素,只要不调用setNotifyOnChange(false).

,调用这些方法就会在内部调用notifyDataSetChanged()
addAll(Collection<? extends T> collection)
addAll(T ... items)
insert(T object, int index)
remove(T object)
clear()

所以对于第二个例子,你真的不需要 setEmployees() 方法,你可以 mAdapter.addAll(data).