我想在我的 Android ApplicationnotifyDataSetChanged() An的方法 ArrayAdapter 但这对我不起作用。

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

有人可以发送示例还是至少一个链接?

有帮助吗?

解决方案

ArrayAdapter, notifyDataSetChanged 仅当您使用 add(), insert(), remove(), , 和 clear() 在适配器上。

ArrayAdapter 是构造的,它具有 List 那是通过的。如果您要通过 List 那是活动的成员,后来更改该活动成员, ArrayAdapter 仍在持有原始 List. 。适配器不知道您更改了 List 在活动中。

您的选择是:

  1. 使用 ArrayAdapter 修改基础列表(add(), insert(), remove(), clear(), , ETC。)
  2. 重新创建 ArrayAdapter 与新的 List 数据。 (使用大量资源和垃圾收集。)
  3. 创建自己的班级 BaseAdapterListAdapter 这允许改变基础 List 数据结构。
  4. 使用 notifyDataSetChanged() 每次列表都会更新。要在UI-Thread上称呼它,请使用 runOnUiThread()Activity。然后, notifyDataSetChanged() 将工作。

其他提示

您可以使用 runOnUiThread() 方法如下。如果您不使用 ListActivity, ,只需调整代码即可获取您的参考 ArrayAdapter.

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

我最近写了这个话题,尽管这篇文章旧了,但我认为这对想知道如何实施的人会有所帮助 BaseAdapter.notifyDataSetChanged() 逐步以正确的方式。

请关注 如何在Android中正确实现baseadapter.notifydatasetchanged() 或者 较新的博客baseadapter.notifydatasetchanged().

我遇到了同样的问题,我不想连续使用新实例替换整个阵列。因此,我让适应器的人在其他地方进行繁重的举重。

将其添加到通常(尝试)致电通知的位置

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);
        }
    }
}

我知道这是一个较晚的回应,但我正面临类似的问题,我设法通过使用来解决它 notifyDataSetChanged() 在正确的位置。

所以我的情况如下。

我必须在Action Bar选项卡(片段)中更新ListView,其中内容是完全不同的活动返回的内容。但是,最初,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 它将直接更新我的listView FragmentTab2.

希望有人发现这有用!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top