在 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