9

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

这是显示名称列表的类

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()”之外什么也没发现,这不起作用。

4

2 回答 2

29

您遇到的问题是您正在覆盖条目引用并且它没有在适配器上更改。这是解决此问题的方法

@Override
public void onResume() {

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

}

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

于 2013-04-25T16:21:14.117 回答
5

notifyDataSetChanged()对您不起作用。原因

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

始终创建新列表并将其添加到适配器。这样做:

  1. 在全局声明时初始化 arrayList。
  2. 直接将 List 添加到适配器,而不检查 null 和空条件。直接将适配器设置到列表中(不检查任何条件)。Adapter 保证无论您在哪里更改 arrayList 的数据,它都会小心处理,但绝不会丢失引用。
  3. 每次将数据添加到arrayList(如果您的数据是全新的,则在实际将数据添加到列表之前可以调用adapter.clear()和arrayList.clear())但不要设置适配器,即如果新数据是填充在 arrayList 中,而不仅仅是 adapter.notifyDataSetChanged()

保持对文档的信任

于 2013-12-09T19:22:08.560 回答