在 Android 中刷新 ListView 适配器的正确方法
Correct way to refresh a ListView adapter in Android
我有一个物品清单。我有一个按钮,可以将您发送到另一个 activity 以创建新项目。保存新项目时,意图会将您带回 activity,其中包含应添加新项目的列表。适配器从 BaseAdapter 扩展而没有过滤,它只是将数据设置到视图。
我的代码是这样的:
onCreate(){
ListView listView = findItemById......
listView.setListeners.......
}
onResume(){
data = getData();
adapter = new ListAdapter(context,data);
listView.setAdapter(adapter);
}
它有效,但这是正确的吗?
我可以在 onCreate 中使用创建适配器和 setAdapter 并仅在 onResume 中使用 notifyDataSetChanged() 吗?
将此方法添加到您的适配器,然后使用 adapter.udpateData(data)
:
使用新数据调用它
public void updateData(List data) {
this.data = data;
notifyDataSetChanged();
}
此外,您可以使用 notifyItemRangeInserted(0, data.size())
我认为正确的做法是使用
startActivityForResult(...)
启动第二个 activity 的方法(添加新项目的地方)。
并且在你的第二个activity中使用
setResults(RESULT_OK or RESULT_CANCELLED)
(添加新项目或用户刚刚返回上一个屏幕时的不同结果)。
然后在你的ListAdapter中class添加方法
public void updateData(List data) {
this.data = new ArrayList<>(data);
notifyDataSetChanged();
}
并在你的 onActivityResults(...) 中调用它
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == YOUR_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
adapter.updateData(...your data from result Intent, or from anywhere else...);
}
}
此外,我强烈建议您使用 RecyclerView 而不是 ListView
更新: 回答你的问题 - 我认为你的代码中最大的错误是在 onResume() 方法中创建 ListAdapter 对象的新实例,当它没有必要时
嗨 OnActivityResult 读取所有数据创建新对象并添加到列表并调用 notifyDatasetChanged() ,我将自动刷新 ui
我有一个物品清单。我有一个按钮,可以将您发送到另一个 activity 以创建新项目。保存新项目时,意图会将您带回 activity,其中包含应添加新项目的列表。适配器从 BaseAdapter 扩展而没有过滤,它只是将数据设置到视图。
我的代码是这样的:
onCreate(){
ListView listView = findItemById......
listView.setListeners.......
}
onResume(){
data = getData();
adapter = new ListAdapter(context,data);
listView.setAdapter(adapter);
}
它有效,但这是正确的吗?
我可以在 onCreate 中使用创建适配器和 setAdapter 并仅在 onResume 中使用 notifyDataSetChanged() 吗?
将此方法添加到您的适配器,然后使用 adapter.udpateData(data)
:
public void updateData(List data) {
this.data = data;
notifyDataSetChanged();
}
此外,您可以使用 notifyItemRangeInserted(0, data.size())
我认为正确的做法是使用
startActivityForResult(...)
启动第二个 activity 的方法(添加新项目的地方)。
并且在你的第二个activity中使用
setResults(RESULT_OK or RESULT_CANCELLED)
(添加新项目或用户刚刚返回上一个屏幕时的不同结果)。
然后在你的ListAdapter中class添加方法
public void updateData(List data) {
this.data = new ArrayList<>(data);
notifyDataSetChanged();
}
并在你的 onActivityResults(...) 中调用它
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == YOUR_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
adapter.updateData(...your data from result Intent, or from anywhere else...);
}
}
此外,我强烈建议您使用 RecyclerView 而不是 ListView
更新: 回答你的问题 - 我认为你的代码中最大的错误是在 onResume() 方法中创建 ListAdapter 对象的新实例,当它没有必要时
嗨 OnActivityResult 读取所有数据创建新对象并添加到列表并调用 notifyDatasetChanged() ,我将自动刷新 ui