notifyDataSetChanged示例

时间:2010-09-08 15:27:45

标签: android android-arrayadapter notifydatasetchanged

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

我发现as answer herenotifyDataSetChanged()应该在主线程中运行,但没有示例。

有人可以发送示例或至少发送链接吗?!

5 个答案:

答案 0 :(得分:315)

对于ArrayAdapternotifyDataSetChanged仅在适配器上使用add()insert()remove()clear()时才有效。

构建ArrayAdapter时,它会保留传入的List的引用。如果您要传入属于Activity的成员List,稍后更改该活动成员时,ArrayAdapter仍然保留对原始List的引用。适配器不知道您更改了活动中的List

您的选择是:

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

答案 1 :(得分:30)

您可以使用runOnUiThread()方法,如下所示。如果您没有使用ListActivity,只需调整代码即可获得对ArrayAdapter的引用。

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

答案 2 :(得分:11)

我最近写过这个主题,虽然这篇文章很老,但我认为对于想要知道如何以正确的方式逐步实施BaseAdapter.notifyDataSetChanged()的人会有所帮助。

请关注How to correctly implement BaseAdapter.notifyDataSetChanged() in Androidthe newer blog BaseAdapter.notifyDataSetChanged()

答案 3 :(得分:6)

我遇到了同样的问题,我不想连续用新的实例替换整个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);
        }
    }
}

答案 4 :(得分:2)

我知道这是一个迟到的回复,但我遇到了类似的问题,我设法通过在正确的位置使用notifyDataSetChanged()来解决它。

所以我的情况如下。

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

希望有人觉得这很有用!