Listview in saveInstanceState und restoreInstanceState

  • Antworten:4
Gelöschter Account
  • Forum-Beiträge: 28

12.04.2018, 16:42:24 via Website

Guten Tag!
ich habe in diesem Forum gesucht udn verstehe nicht ganz, wie es laufen soll, wenn ich nach einem Orientierungswechsel den Zustand meines Listviews unverändert sehen will.
ich dache, dass ich die Funktion saveInstanceState und restoreInstanceState wie folgt überschreibe und dass diese automatisch bei einem Orientierungswechsel ausgeführt werden.

Ich habe eine Funktion onSaveInstanceState, eine Funktion onRestoreInstanceState.
Jetzt führe ich in onCreate auch das Restore der Listview aus.
Der Code steht hier unten.
Im Log sehe ich jetzt alle Log-Einträge, die beweisen, dass die Funktionen alle ausgeführt werden.
Trotzdem ist die Listview verschwunden, sobald ich in die Landscape-Orientierung gehe.
Kann mir jemand sagen, was fehlen mag?

Vielen Dank im Voraus

MBoerner

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.i(TAG, "*****INFO: saving listview state");
    outState.putParcelable("listview.state", lvFoundBLE.onSaveInstanceState());


}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Log.i(TAG, "*****INFO: restoring listview state");
    Parcelable listViewState = savedInstanceState.getParcelable("listview.state");
    lvFoundBLE.onRestoreInstanceState(listViewState);
}

und in OnCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState !=null) {
        Log.i(TAG, "*****INFO: mListViewInstanceState = savedInstanceState.getParcelable");
        mListViewInstanceState = savedInstanceState.getParcelable("listview.state");
    }
   setContentView(R.layout.activity_main);
    .....
   lvFoundBLE.setAdapter(adapter);

    /// Evt zurückspielen der letzte Instanz (falls Bildschirm-Drehung)
    if (savedInstanceState !=null && mListViewInstanceState!=null) {
        Log.i(TAG, "*****INFO: vor lvFoundBLE.onRestoreInstanceState(mListViewInstanceState");
        lvFoundBLE.onRestoreInstanceState(mListViewInstanceState);
        Log.i(TAG, "*****INFO: nach lvFoundBLE.onRestoreInstanceState(mListViewInstanceState");
    }

— geändert am 13.04.2018, 12:02:18

Kommentieren
Gelöschter Account
  • Forum-Beiträge: 11

18.04.2018, 16:30:29 via Website

Hi,
mit "putParcelable" kannst du nur Key Wertepaare speichern keine Liste.
"putParcelable (String key, Parcelable value)"

versuche es mal mit "putParcelableArrayList (String key, ArrayList value)"

Link wurde gekürtz da ich noch keinen Link Posten darf. Setze das Übliche Https.... davor
developer.android.com/reference/android/os/Bundle.html

— geändert am 18.04.2018, 18:35:09

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.04.2018, 16:45:28 via Website

@jogimuc: Stimmt nicht, wenn deine Liste von Parcables erben würde, ginge das auch...
Da das aber nicht der fall ist ist es einfacher die ArrayList zu übergeben.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 11

18.04.2018, 17:05:45 via Website

Er will es nicht an eine andere Activity übergeben sondern im Bundle Speichern was der Activity übergeben wurde.

Gehen könnte auch "void putStringArrayList (String key, ArrayList value)"
wenn es eine Liste aus Strings ist. Wir wissen nicht von welchen Typ die ArrayList ist.

— geändert am 18.04.2018, 18:30:26

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 28

19.04.2018, 11:37:26 via Website

Die Arraylist ist eine String-Liste.
Ich werde es mit "putStringArrayList (String key, ArrayList value)" probieren, ich melde mich dann, ob es geklappt hat.
Vielen Dank an alle!

Hilfreich?
Kommentieren