Android中刷新ListView适配器的正确方法

Android中刷新ListView适配器的正确方法,android,listview,android-adapter,baseadapter,Android,Listview,Android Adapter,Baseadapter,我有一份物品清单。我有一个按钮,可以将您发送到另一个活动,以便创建一个新项目。保存新项目时,一个意图会将您发送回活动,其中包含应添加新项目的列表。适配器从BaseAdapter扩展而来,没有过滤,它只是将数据设置为视图 我的代码是: onCreate(){ ListView listView = findItemById...... listView.setListeners....... } onResume(){ data = getData(); adap

我有一份物品清单。我有一个按钮,可以将您发送到另一个活动,以便创建一个新项目。保存新项目时,一个意图会将您发送回活动,其中包含应添加新项目的列表。适配器从BaseAdapter扩展而来,没有过滤,它只是将数据设置为视图

我的代码是:

onCreate(){
    ListView listView = findItemById......
    listView.setListeners.......
}

onResume(){
    data = getData();
    adapter = new ListAdapter(context,data);
    listView.setAdapter(adapter);
}
它是有效的,但这是正确的吗


我是否可以在onCreate中使用创建适配器和setAdapter,并仅在onResume中使用notifyDataSetChanged()。

将此方法添加到适配器,然后使用
适配器使用新数据调用它。udpateData(数据)


另外,您可以使用notifyItemRangeInserted(0,data.size())

我认为正确的方法是使用

startActivityForResult(...)
方法启动第二个活动(在其中添加新项目)

在你的第二个活动中使用

setResults(RESULT_OK or RESULT_CANCELLED)
(添加新项目或用户返回上一屏幕时的不同结果)

然后在ListAdapter类中添加方法

public void updateData(List data) {
    this.data = new ArrayList<>(data);
    notifyDataSetChanged();
}
我还强烈建议您使用RecyclerView而不是ListView


UPD:回答您的问题-我认为您的代码中最大的错误是在onResume()方法中创建ListAdapter对象的新实例,当不需要时

Hi-OnActivity Result读取所有数据创建新对象并添加到列表并调用notifyDataSangeetchd(),我会自动刷新ui

确定,您可以在
onCreate
中创建适配器,在那里调用
setAdapter
并在
onResume
中调用
notifyDataSetChanged
,这取决于
ListAdapter
的实现方式。。。fx:如果它扩展ArrayAdapter并使用筛选(从ArrayAdapter扩展而不是从BaseAdapter扩展的唯一原因),那么它可能不起作用,但如果您扩展BaseAdapter并直接使用传递的
数据
引用,则是。。。请记住,如果执行
data=getData()它将不起作用,因为在此之后,
数据
将是一个不同的引用,然后先前传递给适配器。您可能会发现这很有帮助:-以上是一种不好的做法吗?有点
是一种不好的做法
,但是如果它起作用,那么不要担心。。。
public void updateData(List data) {
    this.data = new ArrayList<>(data);
    notifyDataSetChanged();
}
@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...);
    }
}