notifyDataSetChanged不使用arraylist数据类型

时间:2014-07-05 08:52:34

标签: java android arraylist

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

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

关于主要的行动,我在全球宣布了arraylist。

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

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

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;

1 个答案:

答案 0 :(得分:2)

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

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

对于您的任务,我建议您在适配器类中引入一种新方法,例如setData(ArrayList<HashMap<String, String>> 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);
}