刷新ArrayAdapter onResume [notifyDataSetChanged()不工作]
我正在使用Fragments创建联系人列表应用程序,其中一个frag是联系人列表中的名称列表,另一个是其余细节。刷新ArrayAdapter onResume [notifyDataSetChanged()不工作]
这里是显示名称的列表
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()”不起作用。
您遇到的问题是您覆盖了条目引用,并且它没有在适配器上发生变化。这里是你如何解决这个问题
@Override
public void onResume() {
super.onResume();
entries.clear();
entries.addAll(contactStorage.getContactListNames());
adapter.notifyDataSetChanged();
Log.d(TAG, "List Frag Resumed");
}
这是一个常见的错误之作,它造成的,因为当你第一次创建一个列表(在内存中)和你的entries
场点,你再告诉adapter
看在创建内存位置时,但您在内存中创建一个新列表(当您再次获取联系人列表名称时),并告诉条目指向内存中的新列表时,您需要做的是将内存中的条目替换包含新列表中条目的原始列表,那样adapter
仍然会引用相同的列表。
完美!我知道这与'.add()'有关,但我无法在这个话题上得到明确的答案。非常感谢你! – RockJake28 2013-04-25 16:24:23
我也加了一个关于这个问题的更好的解释。另一种可以用你的ArrayAdapter实现的方法是恢复'adapter.clear();'然后'adapter.addAll(contactStorage.getContactListNames());'并且只是忘记所有的条目字段。 – Eluvatar 2013-04-25 16:25:56
感谢队友,addAll做到了神奇;) – Salmaan 2015-04-10 20:14:53
notifyDataSetChanged()将不适用于您。原因为什么
您的适配器失去对您的列表的引用。当你第一次初始化Adapter时,它会引用你的arrayList并传递给它的父类。但是,如果你重新初始化现有的ArrayList它losts与适配器:(参考因此,通信信道
始终创建并添加一个新的列表适配器这样做:。
- 初始化ArrayList中而全球范围内宣布。
- 添加列表中直接向适配器进行检查空和空 状况。直接将适配器列表(不检查任何 条件)。适配器给你保证,无论你在哪里 改变数据的arrayList它会照顾,但不会松动 参考。
- 将数据添加到arrayList每次(如果您的数据是全新的 比您可以调用adapter.clear()和arrayList.clear()之前 实际将数据添加到列表中),但不要设置适配器即如果 新的数据填充ArrayList中不仅仅是 adapter.notifyDataSetChanged()
守信用,以之证件
好了,你有什么期待?您正在检索“条目”,但不会重新构建您的“适配器”。将'entires ='和'adapter ='这两行从'onCreate()'移动到'onResume()'(你应该只做一次),'onResume()'忘记'entries ='和'notify''你会没事的。 – 2013-04-25 16:16:11
@ClassStacker - 仍然是同样的问题。在屏幕旋转之前不刷新列表。 – RockJake28 2013-04-25 16:19:46
嗯,是的,对不起,你还必须在那里做setListAdapter()。 – 2013-04-25 16:23:02