Hallo!
Ich habe da ein Problem mit den Fragmenten. Folgende Situation:
Ich habe ein ListFragment in welchem in einer Liste eine Navigationsstruktur abgebildet werden soll. Konkret soll man beim Klick auf ein Item in der Liste in die nächste Stufe, also eine Hierarchie-Ebene weiter kommen. Die Listview habe ich über einen Adapter befüllt, den ich an das Fragment gebunden habe. Wird auch sauber dargstellt. Auch das Auswählen eines Items und die Anzeige der nächsten Navigations-Ebende klappt super. Das habe ich über die Fragment Transaction gelöst: Erst das bestehende ListFragment mit remove() entfernt und dann das gleiche Fragment neu erzeugt und mit add() wieder eingefügt. Für eine Rückwärts-Navigation rufe ich auch noch ein addToBackStack auf, bevor ich die Transaktion comitte. Dann die ArrayListe, die den ArrayAdapter befüllt, aktualisiert und an das neue Fragment angebunden. Diese Vorwärts-Navigation klappt super.
Probleme habe ich aber mit der Rückwärts-Navigation. Der Nutzer soll wenn er den Back Butteon drückt wieder eine Navigations-Ebene zurück springen können. Deswegen habe ich ja auch das addToBackStack in meine Transaktion mit eingebaut. Wenn man nun den Back Button drückt, springt das Fragment auch um (zurück). Allerdings wird die vorherige Listenansicht nicht geladen bzw. wieder aufgebaut.
Ich gehe mal davon aus, dass ich die Elemente der Liste irgendwo zwischenspeichern müsste, um sie dann beim Aufruf des vorherigen ListFragments für den Wiederaufbau der Liste verwenden zu können. Aber wie soll ich das machen? Ich habe gedacht, dass onSaveInstanceState dabei hilfreich wäre. Diese Methode wird bei der Transaktion aber gar nicht erst aufgerufen (habe ich mit einem Log.d("...","...") überprüft; wird nicht aufgerufen). Was ich dabei heraus gefunden habe, ist, dass onSaveInstanceState bei einer Rotation des Geräts aufgerufen wird. Also von z.B. Portrait auf Landscape oder umgekehrt. Aber das nutzt mir bei meinem Problem nichts.
Also wie mache ich das am besten, damit meine ListView hinterher wieder hergestellt werden kann? Wo im Code speichere ich die Daten weg? Und vor allem - wo speicher ich die Daten hin? SharedPreferences wäre eine Möglichkeit, wenn ich nur eine weitere Navigations-Ebene hätte. Ich habe aber mehrere Stufen (bis in eine 5. Ebene). Da sind die SharedPreferences keine Lösung mehr, da es ein großer Aufwand wäre zu verfolgen, wo ich mich gerade befinde und welche gespeicherten Informationen für die Liste ich bei einem Schritt rückwärts wieder laden müsste.
Ich habe mir schon überlegt, dass die Verwendung eines Stacks hiflreich wäre. Erst alle Items auf den Stack schieben. Als letztes Element die Anzahl der Einträge drauf schieben und dann das nächste ListFragment laden. Geht man noch eine Schritt weiter, wieder die aktuellen Element drauf schieben. Geht man einen Schritt zurück, dann zieht man sich die Items der vorherigen Ansicht vom Stack und baut die Liste so wieder auf. Allerdings wollte ich mal fragen, ob es da vielleicht eine elegantere Lösung gibt?
Die Items in der Liste sind übrigens alles Strings. Pro Eintrag ein String, dargestellt über eine "android.R.layout.simple_list_item_1"-Liste.
Gruß