ナビゲーション構造を含むリストビューを含む 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 をそれにバインドします。これは実際に進行中の作業です。終了したら、このアプローチの結果を書きます。