刷新ArrayAdapter onResume [notifyDataSetChanged()不工作]

时间:2013-04-25 16:10:35

标签: android refresh fragment android-arrayadapter

我正在使用片段创建一个联系人列表应用程序,其中一个frag是联系人列表中的名称列表,另一个是剩余的详细信息。

这是显示名称列表

的类
public class MyListFragment extends ListFragment {

private ContactStorage contactStorage = new ContactStorage();

public final static String TAG = "FRAGMENTS";
private MainActivity parent;
ArrayAdapter<String> adapter;

ArrayList<String> entries = new ArrayList<String>();

String array[];

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.list_layout, null);
    parent = (MainActivity) getActivity();
    entries = contactStorage.getContactListNames();

    adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), 
            android.R.layout.simple_list_item_1, entries);

    setListAdapter(adapter);
    Log.d(TAG, "Adapter created");
    array = contactStorage.getContactDetails();
    return v;

}

@Override
public void onResume() {

    super.onResume();
    entries = contactStorage.getContactListNames();
    adapter.notifyDataSetChanged();
    Log.d(TAG, "List Frag Resumed");

}
}

我遇到的问题是ArrayAdapter在恢复时不会刷新。

当屏幕旋转时,它再次运行onCreateView(),但我需要刷新onResume。我查看了这个网站加载,但发现“使用notifyDataSetChanged()”无效。

2 个答案:

答案 0 :(得分:29)

您遇到的问题是您正在覆盖条目参考,并且它未在适配器上进行更改。以下是解决此问题的方法

@Override
public void onResume() {

    super.onResume();
    entries.clear();
    entries.addAll(contactStorage.getContactListNames());
    adapter.notifyDataSetChanged();
    Log.d(TAG, "List Frag Resumed");

}

这是一个常见的错误,因为当你第一次创建一个列表(在内存中)并且你的entries字段指向那个时,你会告诉adapter在创建它时查看该内存位置,但onResume在内存中创建一个新列表(当你再次获得联系人列表名称时),并告诉条目指向内存中的新列表,你需要什么do是用新列表中的条目替换原始列表中的条目,这样adapter仍将引用相同的列表。

答案 1 :(得分:4)

notifyDataSetChanged()不适合您。

的原因

您的适配器会丢失对您的列表的引用。首次初始化Adapter时,它会引用您的arrayList并传递给它的超类。但是,如果重新初始化现有的arrayList,它会丢失引用,从而丢失与Adapter的通信通道:(。

始终为适配器创建和添加新列表。这样做:

  1. 在全局声明的同时初始化arrayList。
  2. 直接向适配器添加列表,不检查null和空 条件。直接将适配器设置为列表(不要检查任何适配器 条件)。适配器可以保证您无论身在何处 更改arrayList的数据它会照顾,但永远不会松散 参考
  3. 每次都将数据添加到arrayList(如果您的数据是全新的 比之前你可以调用adapter.clear()和arrayList.clear() 实际上将数据添加到列表中)但是没有设置适配器,即If 新数据填充在arrayList中而不仅仅是 adapter.notifyDataSetChanged()
  4. 保持对文档的信任