【问题标题】:notifyDataSetChanged not working with arraylist datatypenotifyDataSetChanged 不适用于 arraylist 数据类型
【发布时间】:2014-07-05 08:52:33
【问题描述】:

我知道这个问题被问了很多,但是我花了很长时间浏览所有的 q/a 并没有解决这个问题。

我的应用程序定期从服务类启动的 AsyncTask 获取数据。异步任务上的 OnProgressUpdate 调用主要活动正在侦听的广播。数据是从意图中获取的。

在主要活动上,我全局声明数组列表。

private  ArrayList<HashMap<String, String>> askOrder = new ArrayList<HashMap<String, String>>();

然后我在 oncreateview 上使用空数据设置适配器。

ListView listVask = (ListView) myFragmentView.findViewById(R.id.listViewAsk);
adapterAsk = new askOrderAdapter(getActivity(),askOrder);
listVask.setAdapter(adapterAsk);

当 asynctask 上的广播有新数据时,它会调用 sendbroadcast。为其注册了 updateUI 方法。数据已放入意图中。我查过了

 public void updateUI(Intent intent){
     askOrder = (ArrayList<HashMap<String, String>>) intent.getExtras().get("askOrder");
     listVask = (ListView) myFragmentView.findViewById(R.id.listViewAsk);
     ((BaseAdapter) listVask.getAdapter()).notifyDataSetChanged();

所以当调用 notifyDataSetChanged 时不会更新适配器以获取 arraylist askOrder 中的新数据

当我更改应用程序逻辑时,我之前已经完成了这项工作。我有一个单独的类数据来存储所有数据。 asynctask 会将数据写入该类,并且数据将存储为静态变量。然后它会通知 MainActivity 重新检查数据。然后 MainActivity 将更新变量 askOrder,如下所示。

orderbookData 是存储数据的类文件。

askOrder = orderbookData.askOrder;

【问题讨论】:

  • NotifyDataSetChanged 没有更新列表视图
  • @jgriffsta 它应该可以工作。适配器在哪里设置为列表视图,当您将新项目添加到列表时需要刷新
  • @Raghunandan 抱歉,我不完全理解您的评论。我没有数据显示在列表视图中,所以我一定做错了什么。
  • @jgriffsta 您无需再次初始化列表视图。当你想刷新列表视图时调用adapterAsk.notifyDataSetChanges()
  • @jgriffsta:这里 Raghunandan 是正确的,而不是 ((BaseAdapter) listVask.getAdapter()).notifyDataSetChanged();只需添加 adapterAsk.notifyDataSetChanges();在这里您将获得相同的适配器并能够刷新您的列表。

标签: java android arraylist


【解决方案1】:

问题在于您没有更改适配器的内容,因此对 notifyDataSetChanged 的调用毫无意义 - 没有新数据可表示。

看来您可能误解了notifyDataSetChanged 的语义。通常这并不意味着'嘿,适配器,你的基础数据已经改变,更新你自己'(你可以那样实现它,但我不推荐它)。这意味着适配器的内容已更改已经,因此必须通知此适配器的观察者(如 listview)有关更改以采取操作以显示新数据。所以你应该很少在适配器之外调用这个方法。这种外部调用可能适用的唯一情况是适配器的内部数据结构是共享的(可能是适配器只在内部存储对提供的列表的引用,然后在外部修改该列表)。但这种方法可能会导致一些微妙的问题。

对于您的任务,我建议为您的适配器类引入一个新方法,例如setData(ArrayList&lt;HashMap&lt;String, String&gt;&gt; newData),它将更新底层适配器的数据结构并在此之后在内部调用notifyDataSetChanged。与您的适配器关联的 ListView 将因此重新请求更新的视图,并且适配器应根据更新的内部数据提供这些视图。

void updateUI() {
 askOrder = (ArrayList<HashMap<String, String>>) intent.getExtras().get("askOrder");
 listVask = (ListView) myFragmentView.findViewById(R.id.listViewAsk);
 ((askOrderAdapter) listVask.getAdapter()).setData(askOrder);
}

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多