我有一个带有listview的Android应用程序,当用户按下按钮时会更新列表视图。该应用有两个操作栏标签。当我在选项卡之间切换,旋转屏幕或按回退出活动时,列表视图中的所有数据都会消失。我需要保留数据。我知道至少在方向改变时我可以将数据保存在onSaveInstanceState()中。所以我在savedInstanceState中保存了一个String [],并在onCreateView()中检索String []。这似乎工作正常,它正确读取数据。然后我尝试更新列表视图。这似乎也可以读取数据并正常工作,只有列表视图不会更新,而是保持空白。我的代码是:
if (savedInstanceState != null) {
lvArray = savedInstanceState.getStringArray("lvArray");
setupListView();
} else {
lvArray= new String[LISTVIEW_LIMIT];
for (int i = 0; i < LISTVIEW_LIMIT; i++) {
lvArray[i] = " ";
}
setupListView();
}
private void setupListView() {
if (listview.getAdapter() == null) {
ArrayAdapter<String> listviewAdapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, lvArray);
listview.setAdapter(listviewAdapter);
}
registerForContextMenu(listview);
}
正如我所说,我经历了这个,它正确读取数据,它设置数据的ArrayAdapter,并为listview设置适配器。这一切似乎都有效,只是它实际上没有更新它。我知道那里的所有数据,但它仍然无法正常工作?
此外,我可以将listview设置为不同的大小(通过LISTVIEW_LIMIT)。这样可以正常工作,除了它还会删除列表视图中已有的所有数据。当限制发生变化时,如何保留数据而不是重新创建数组?
在onPause()或onStop()中保存这个的最佳方法是什么,这样即使按下后退或切换标签,我也可以保持列表视图?
编辑:更改为使用notifyDataSetChanged(),仍然无效:
lvStopwatch = (ListView) view.findViewById(R.id.list_stopwatch);
stopwatchTimes = new String[TOTAL_TIMES];
for (int i = 0; i < TOTAL_TIMES; i++) {
stopwatchTimes[i] = " ";
}
setupListView();
if (savedInstanceState != null) {
stopwatchRunning = savedInstanceState.getBoolean("stopwatchRunning", false);
stopwatchTimes = savedInstanceState.getStringArray("stopwatchTimes");
stopwatchAdapter.notifyDataSetChanged();
} else {
stopwatchRunning = prefs.getBoolean("stopwatchRunning", false);
Log.d("savedPASS", String.valueOf(stopwatchRunning));
}
private void setupListView() {
if (lvStopwatch.getAdapter() == null) {
stopwatchAdapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, stopwatchTimes);
lvStopwatch.setAdapter(stopwatchAdapter);
}
registerForContextMenu(lvStopwatch);
}
答案 0 :(得分:0)
试试这个
adapter.notifyDataSetChanged();
答案 1 :(得分:0)
将listview数据保存在某些数据结构中
我发现HashMaps
最适合这个
如果要填充,请再次致电销售适配器。
adapter=new MyAdapter(dataHashMap);
listView.setAdapter(adapter);
答案 2 :(得分:0)
找到解决方案。出于某种原因,在onCreateView()方法中恢复它时,它不会正确显示值。我在片段的onCreate()方法中恢复了它们。除了将saveInstanceState检查移动到onCreate()方法之外,我没有太多改变,但现在它可以正常工作。