刷新ArrayAdapter onResume

我正在使用Fragments创build联系人列表应用程序,其中一个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()”不起作用。

Solutions Collecting From Web of "刷新ArrayAdapter onResume"

您遇到的问题是您覆盖了条目引用,并且在适配器上没有更改。 这是你如何解决这个问题

 @Override public void onResume() { super.onResume(); entries.clear(); entries.addAll(contactStorage.getContactListNames()); adapter.notifyDataSetChanged(); Log.d(TAG, "List Frag Resumed"); } 

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

notifyDataSetChanged()将无法为您工作。 原因

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

始终创build并向适配器添加新的列表。 这样做:

  1. 在全局声明的同时初始化arrayList。
  2. 直接将列表添加到适配器中,不用检查空和空的条件。 直接将适配器设置到列表中(不要检查任何条件)。 适配器给你保证,无论你在哪里改变arrayList的数据,它会照顾,但从来没有松动的参考。
  3. 将数据添加到arrayList每次(如果你的数据是完全新的,你可以在实际向列表中添加数据之前调用adapter.clear()和arrayList.clear()),但是不要设置适配器,即如果新数据是在arrayList中填充的不仅仅是adapter.notifyDataSetChanged()

保持对文件的信任