175

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

我在这里找到了答案,它notifyDataSetChanged()应该在主线程中运行,但是没有示例。

任何人都可以发送一个示例或至少一个链接吗?!

4

5 回答 5

334

对于ArrayAdapter,notifyDataSetChanged仅当您在适配器上 使用add()insert()remove()和时才有效。clear()

构造an 时ArrayAdapter,它保存List传入的 的引用。如果您要传入List作为 Activity 成员的 a ,并稍后更改该 Activity 成员,ArrayAdapter则 仍然持有对原始 . 的引用List。Adapter 不知道你List在 Activity 中改变了。

您的选择是:

  1. 使用 的函数ArrayAdapter修改底层列表(add()insert()remove()clear()等)
  2. ArrayAdapter使用新List数据重新创建。(使用大量资源和垃圾收集。)
  3. 创建您自己的派生类,BaseAdapterListAdapter允许更改基础List数据结构。
  4. notifyDataSetChanged()每次更新列表时使用。要在 UI 线程上调用它,请使用runOnUiThread(). Activity然后,notifyDataSetChanged()将工作。
于 2011-02-23T14:49:19.700 回答
35

您可以使用以下runOnUiThread()方法。如果您不使用ListActivity,只需修改代码以获取对您的ArrayAdapter.

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
于 2010-09-08T15:50:16.050 回答
12

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

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

于 2013-02-15T10:24:14.963 回答
7

我遇到了同样的问题,我不想连续用新实例替换整个 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);
        }
    }
}
于 2011-12-13T20:41:43.517 回答
3

我知道这是一个迟到的回应,但我遇到了类似的问题,我设法通过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

希望有人觉得这很有用!

于 2014-09-18T17:57:25.943 回答