NotifyDataSetChanged 示例

我正在尝试在我的 Android Application中使用 notifyDataSetChanged()方法作为 ArrayAdapter,但它对我不起作用。

我发现 作为回答,即 notifyDataSetChanged()应该在主线程中运行,但是没有这样的例子。

有人能发个例子或者至少发个链接吗!

353381 次浏览

您可以按照以下方式使用 runOnUiThread()方法。如果您不使用 ListActivity,只需调整代码以获得对 ArrayAdapter的引用。

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});

对于 ArrayAdapternotifyDataSetChanged只有在适配器上使用 add()insert()remove()clear()时才能工作。

构造 ArrayAdapter时,它保存传入的 List的引用。如果您要传入一个作为 Activity 成员的 List,并在以后更改该 Activity 成员,则 ArrayAdapter仍然保留对原始 List的引用。适配器不知道您在活动中更改了 List

你的选择是:

  1. 使用 ArrayAdapter的函数修改基础 List (add()insert()remove()clear()等)
  2. 使用新的 List数据重新创建 ArrayAdapter(使用大量资源和垃圾收集)
  3. 创建自己的从 BaseAdapterListAdapter派生的类,允许更改基础 List数据结构。
  4. 每次更新列表时使用 notifyDataSetChanged()。要在 UI-Thread 上调用它,请使用 ActivityrunOnUiThread()。 然后,notifyDataSetChanged()将工作。

我也有同样的问题,我不想用一个新的实例连续地替换整个 ArrayAdapter。因此,我让 AdapterHelper 在其他地方完成繁重的工作。

在您通常(尝试)调用通知的地方添加这个

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();

AdapterHelper 类

public class AdapterHelper {
@SuppressWarnings({ "rawtypes", "unchecked" })
public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
arrayAdapter.clear();
for (Object object : listOfObject){
arrayAdapter.add(object);
}
}
}

我最近就这个话题写了一篇文章,虽然这篇文章已经很老了,但是我认为这篇文章对于那些想知道如何一步一步正确实现 BaseAdapter.notifyDataSetChanged()的人来说是有帮助的。

请跟随 如何在 Android 中正确实现 BaseAdapter.notifyDataSetChanged () 更新的博客 BaseAdapter.notifyDataSetChanged ()

我知道这是一个迟到的反应,但我面临着一个类似的问题,我设法解决它使用 notifyDataSetChanged()在正确的地方。

所以我的情况是这样的。

我必须使用从完全不同的活动返回的内容来更新操作栏选项卡(片段)中的一个 listview。但是最初,列表视图不会反映任何更改。但是,当我单击另一个选项卡,然后返回到所需的选项卡时,将使用来自其他活动的正确内容更新 listview。所以为了解决这个问题,我在必须返回数据的活动代码中使用了操作条适配器的 notifyDataSetChanged()

这是我在活动中使用的代码片段。

@Override
public boolean onOptionsItemSelected(MenuItem item) {


switch (item.getItemId())
{
case R.id.action_new_forward:


FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
Intent ina = new Intent(getApplicationContext(), MainActivity.class);
ina.putExtra("stra", values1);
startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
}
}

这个活动将返回一些数据到 FragmentTab2,它将直接更新我在 FragmentTab2中的列表视图。

希望有人觉得这有用!