【发布时间】:2013-02-07 00:35:44
【问题描述】:
我有一个 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 验证),但其中的前一个 listview 不是t 创建。
我目前正在研究一种新方法。当您单击列表中的某个项目时,我会将当前列表连同对当前 ListFragment 的引用一起写入基于向量的堆栈中。然后我用“onBackPressed()”方法按下后退按钮。所以现在当按下按钮时,我调用已经提到的方法(见上文),将堆栈中的项目数据写回到列表中,通过存储的引用调用表单 ListFragmt 并将更新的 ArrayAdapter 绑定到它。这实际上正在进行中。完成后我会写下这种方法的结果。
【问题讨论】:
-
为什么不为每个屏幕创建一个
ListFragment? -
正如我所提到的,我通过向前导航创建了一个带有新 Listview 的新 ListFragment。示例 a) 单击第 1 项 b) 创建新的 ListFragment;将旧的 ListFragment 放到 backStack c) 为下一个导航阶段获取正确的项目 d) 将新项目绑定到新的 ListFragment e) 前向导航完成!到这里为止一切正常!然后是问题:用户处于下一阶段(参见上面的 a)到 e))并且 f)按下后退按钮。 g) 前一个 ListFragment 被从 backStack 拉出 h) ListFragment 被创建 i) 但前一个 ListView 没有被创建(空 ListFragment)
-
发布用于填充 ListFragment 的代码以及如何移动到下一个片段。
-
我添加了代码。见上文。
-
我还添加了对解决我的问题的新方法的说明。
标签: android android-listview android-fragments android-listfragment fragmenttransaction