0

ナビゲーション構造を含むリストビューを含む ListFragment があります。リストの項目を選択すると、次のナビゲーション階層ステージが表示されます。等々。

次の階層ステージは、新しいフラグメントによって作成され (古いフラグメントを削除し、addToBackStack を使用してフラグメント トランザクションを介して同じフラグメントを新しく追加します)、新しいリストビューの arrayadapter が次のナビゲーション階層の項目に更新されます。それはかなりうまくいきます。

ユーザーが戻るボタンを使用して戻ることができるようにしたいと考えています。そして、ここから私の問題を始めます。リストビューを保存する方法がわからないので、戻るボタンを使用した後に再作成できます。

onSaveInstanceState を使用するのは良い考えだと思いました。ただし、トランザクションがコミットされたときに onSaveInstanceState は呼び出されません。メソッドに Log.d("..","...) を配置して確認しました。呼び出されていません。ビューとその逆.しかし、それは私の問題の助けにはなりません)。

では、リストビューの要素を保存し、戻るボタンを使用して元のフラグメントが作成された後にリストビューを再作成するために戻すのに最適なアイデアは何でしょうか? すべての項目は、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();
    }
}

前述のように、順方向のナビゲーションは問題ありません。しかし、たとえば 2 番目のナビゲーション ステージで [戻る] ボタンを押すと、以前の ListFragment が読み込まれます (Log.d("..."."...)-ListFragment の onCreatView() のメッセージで検証)。その中にあった以前のリストビューは作成されません。


現在、新しいアプローチに取り組んでいます。リスト内の項目をクリックすると、現在の 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 に答える