我有一个 ListFragment,其中包含一个列表视图,其中包含一个导航结构。通过选择列表中的一项,应显示下一个导航层次结构阶段。等等。
下一个层次阶段由一个新片段创建(删除旧片段并使用 addToBackStack 通过片段事务添加新的相同片段),其中新列表视图的 arrayadapter 更新为下一个导航层次结构的项目。那工作还不错。
我希望用户能够通过后退按钮导航回来。从这里开始我的问题。我不知道如何保存列表视图,以便在使用后退按钮后重新创建它。
我认为使用 onSaveInstanceState 是个好主意。但是当事务被提交时不会调用 onSaveInstanceState 。我通过在方法中放置一个 Log.d("..","...) 来检查它。它没有被调用。(我发现,当从纵向旋转到横向时调用 onSaveInstanceState视图,反之亦然。但这对我的问题没有帮助)。
那么在使用后退按钮并创建前一个片段后,存储列表视图的元素并将其取回以重新创建列表视图的最佳想法是什么?所有项目都是存储在绑定到 ListAdapter 的 ArrayList 中的字符串。
这是我的代码。我实现了一个界面,通过单击列表视图中的项目调用父活动中的方法。在这个方法中,我首先调用一个方法来填充已经存在的 ArrayList (navigationsItems) 与作为下一个导航阶段内容的新项目:
我的 ArrayAdapter 的代码:
arrayAdapterFuerNaviList = new ArrayAdapter<String>(
BRC_BoardOverviewActivity.this,
android.R.layout.simple_list_item_1,
navigationsItems);
在这个方法中,我首先调用一个方法来用下一个导航阶段的项目填充 ArrayList (navigationsItems):
// load new itemlist to navigation-
public void inhaltAktuelleNaviListeInArrayLaden() {
navigationsItems.clear();
for (int i = 0; i < prefs.getInt("aktuelleNaviListe_size", 0); i++) {
(...)
navigationsItems.add(titel);
}
}
然后我调用该方法,用它加载新的 ListFragment 并将新的 ArrayAdapter 绑定到它:
// push navifragment to BackStack and create a new instance of it
public void naviFragmenteNeuLaden() {
// get a reference to the actual ListFragment
Fragment removefragment = frgm.findFragmentById(R.id.navi_container);
// initialize ne ListFragment
BRC_NavigationsFragment navifragment = (BRC_NavigationsFragment) frgm
.findFragmentById(R.id.navi_container);
// remove the old and bind the new ListFragment from/to the container ...
FragmentTransaction frgmta = frgm.beginTransaction();
frgmta.remove(removefragment);
frgmta.add(R.id.navi_container, navifragment);
// ... push the old ListFragment on the BackStack and commit ...
frgmta.addToBackStack(null);
frgmta.commit();
frgm.executePendingTransactions();
// ... bind the updated ArrayAdapter to the new ListFragment ...
try {
navifragment.setListAdapter(arrayAdapterFuerNaviList);
} catch (Exception e) {
// TODO
e.printStackTrace();
}
// ... and notify
try {
arrayAdapterFuerNaviList.notifyDataSetChanged();
} catch (Exception e) {
// TODO
e.printStackTrace();
}
}
如前所述,向前导航没有问题。但是当我在第二个导航阶段按下后退按钮时,前一个 ListFragment 被加载(用 ListFragment 的 onCreatView() 中的 Log.d("..."."...)-Messages 验证),但是未创建其中的前列表视图。
我目前正在研究一种新方法。当您单击列表中的某个项目时,我会将当前列表连同对当前 ListFragment 的引用一起写入基于向量的堆栈中。然后我用“onBackPressed()”方法按下后退按钮。所以现在当按下按钮时,我调用已经提到的方法(见上文),将堆栈中的项目数据写回到列表中,通过存储的引用调用表单 ListFragmt 并将更新的 ArrayAdapter 绑定到它。这实际上正在进行中。完成后我会写下这种方法的结果。