0

我有一个 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 绑定到它。这实际上正在进行中。完成后我会写下这种方法的结果。

4

1 回答 1

1

我解决了这个问题。

对于 ListView 的不同导航内容,我定义了一个类“Naviliste”,其中存储了所有项目。如果有人点击一个项目,那么将生成一个带有相应新列表的新列表视图。这些列表是索引的,所以每个列表都有一个固定的 ID。

通过单击 ListView 中的项目,当前 Naviliste 的 ID 被压入堆栈。之后,将创建一个新片段并绑定到它的新列表。如果用户更进一步,则重复相同的过程,依此类推......

如果用户按下后退按钮后退一步,则完成以下操作:

后退按钮的按下是通过放置在父活动中的 onPressedBack() 方法捕获的。通过此方法调用自己的方法。这会拉出最后一个压入堆栈的 ID,然后在新创建的片段中使用它构建前一个列表。

同时,我将沿着一个计数器运行,该计数器计算我所处的导航深度。在前进的每个导航步骤中,它都会增加 1。相反,它只会减少 1。使用此计数器,我可以查询用户是否在导航根目录(计数器 = 0)并再次按下后退按钮离开当前活动。如果是这样,我调用finish() 并且父活动及其片段被关闭。瞧!

它工作得很好。花了一点时间来克服它。但现在我很高兴我的解决方案有效。:)

于 2013-02-08T20:12:04.600 回答