在 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)
.
我注意到处理列表适配器 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)
.