【问题标题】:Correct way to refresh a ListView adapter in Android在 Android 中刷新 ListView 适配器的正确方法
【发布时间】:2017-10-05 07:52:10
【问题描述】:

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

我的代码是这样的:

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

onResume(){
    data = getData();
    adapter = new ListAdapter(context,data);
    listView.setAdapter(adapter);
}

它有效,但这是正确的吗?

我可以在 onCreate 中使用创建适配器和 setAdapter 并仅在 onResume 中使用 notifyDataSetChanged() 吗?

【问题讨论】:

  • 当然,您可以在onCreate 中创建适配器,在那里调用setAdapter 并在onResume 中调用notifyDataSetChanged
  • 这取决于ListAdapter 是如何实现的...... fx:如果它扩展了 ArrayAdapter 并且它正在使用过滤(从 ArrayAdapter 扩展而不是从 BaseAdapter 扩展的唯一原因)那么它可能不起作用,但如果您正在扩展 BaseAdapter 并直接使用传递的 data 引用然后是的......请记住,如果您这样做 data = getData(); 它将不起作用,因为在此之后 data 将是一个不同的引用,然后之前传递给适配器
  • 您可能会发现这很有帮助:- stackoverflow.com/questions/14503006/…
  • 以上是不好的做法吗?
  • 有点像a bad practice,但如果它有效,那么别担心......

标签: android listview android-adapter baseadapter


【解决方案1】:

我认为正确的做法是使用

startActivityForResult(...)

启动第二个活动的方法(添加新项目的地方)。

在你的第二个活动中使用

setResults(RESULT_OK or RESULT_CANCELLED)

(添加新项目或用户刚刚返回上一屏幕时的不同结果)。

然后在你的 ListAdapter 类中添加方法

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

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

【讨论】:

    【解决方案2】:

    将此方法添加到您的适配器,然后使用 adapter.udpateData(data) 使用新数据调用它:

    public void updateData(List data) {
    
      this.data = data;
      notifyDataSetChanged();
    }
    

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

    【讨论】:

      【解决方案3】:

      您好 OnActivityResult 读取所有数据创建新对象并添加到列表中并调用 notifyDatasetChanged() ,我会自动刷新 ui

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多