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

时间:2016-04-18 16:54:22

标签: android android-fragments adapter listadapter

我注意到处理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();
}

1 个答案:

答案 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}}。