German Spinner "gelöscht" nach Pause/Resume

mw71

Active Member
Licensed User
Longtime User
Hallo,

erst mal kurz zur Erklärung. Ich lasse in meiner App eine Tabelle (aus einer SQL DB) erstellen. Diese kann der Nutzer filtern, z.B. nach Datum. Das funktioniert problemlos. Für die Auswahl der Filterkriterien nutze ich Spinner.

Nun zum Problem:
Wenn ich in der App Pause/Resume mache (z.B. durch eine Orientierungsänderung) wird die "Liste" der Spinner gelöscht. Das äußert sich so, das mir die Abfrage Variable=Spinner.SelectedItem eine Fehlermeldung liefert:
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 0


Eigentlich dachte ich das ich das mit StateManager abgefangen habe, aber irgendwie klappt das nicht.

B4X:
Sub Activity_Resume
    StateManager.loadStateFile
    StateManager.RestoreState(Activity,"Main",60)   
end sub

Sub Activity_Pause (UserClosed As Boolean)
     If UserClosed Then
        StateManager.ResetState("Main")
        SQL1.Close
        SQL2.close
    Else
        StateManager.SaveState(Activity, "Main")
    End If
   

    StateManager.SaveSettings
End Sub

Ich hoffe das jemand eine gute Idee hat. Die einzige Lösung die mir derzeit einfällt ist, jedes mal alle Spinner einzeln zu sichern/zurück zu holen. Irgendwie finde ich das aber nicht grade elegant.

Grüße & Danke
 

MaFu

Well-Known Member
Licensed User
Longtime User
Ich verwende den StateManager nicht.
Aber ich vermute, dass dieser wohl nur den aktuellen Index des Spinners sichert, aber nicht den Inhalt. An welcher Stelle werden die Spinner gefüllt? Machst Du ev. diesen Vorgang nur bei FirstTime = True?
 

mw71

Active Member
Licensed User
Longtime User
Moin,

ja, so wie ich dem Code und die Anleitung verstanden habe wird nur der Index gespeichert.
Die Spinner werden immer dann gefüllt wenn der ToggleButten, mit dem ich den Filter ein/ausschalte, aktiviert wird.
Das wird allerdings nicht getan, wenn das Panel mit den Spinner angezeigt und Pause/Resume gemacht wird.

Im Moment habe ich das so gelöst, das ich bei Activity_Resume diese neu befülle. Gefällt mir zwar nicht so richtig,
da das 7 Datenbankabfragen sind, aber wenigstens funktioniert es.

Wenn es eine bessere Lösung gibt nehme ich die gern :)

Grüße
 

MaFu

Well-Known Member
Licensed User
Longtime User
Naja, bei Resume wird die Activity halt neu initialisiert und die Spinner sind erst mal leer. Wenns Dir um die Datenbankabfragen geht, könntest Du die Inhalte der Spinner bei Pause in globalen Listen zwischenspeichern und bei Resume aus diesen wieder befüllen.
 

mw71

Active Member
Licensed User
Longtime User
Moin,

ja, genau so etwa hab ich mir das auch vorgestellt, nur irgendwie bin ich da gescheitert.
Der Plan war an erster Stelle den Namen des Spinners und dann die Daten in ein Array zu Speichern.
(im einfachsten Fall etwas so: Array(1)="NameDesSpinners, Wert1, Wert2, Wert3...")

Ich wollte alle Spinner, erst mal im Panel, ansprechen das klappt auch. Nur bin schon daran gescheitert den Namen des Spinners auszulesen.

B4X:
Dim SaveSpinner As Spinner   

For Each v As View In Panel5
    If v Is Spinner Then
        SaveSpinner = v
        'hier soll der Spinner gespeichert werden
    End If   
Next
 

DonManfred

Expert
Licensed User
Longtime User
Nur bin schon daran gescheitert den Namen des Spinners auszulesen.
Da wo Du den spinner BEFÜLLST kannst Du Dir ein "backup" in einer globalen Variable (array, map, list) machen mit dem Du den spinner jederzeit neu befüllen kannst.

In resume befüllst du den spinner dann mithilfe des backups
 

mw71

Active Member
Licensed User
Longtime User
Danke für die Antwort. Das heißt ja auch dass ich den Namen des Spinners nicht auslesen kann. Somit kann ich auch nur Spinner Sichern/Zurückholen die ich kenne.
Wenn ich einen Spinner neu anlege oder Lösche muss ich diesen dann in die Backup Routine aufnehmen.
Den Plan das ich die Activity nach allen Spinnern durchsuche und diese dann sichere muss ich wohl verwerfen, leider.
Ich werde es erst mal bei der wiederholten Datenbankabfrage belassen, da es ja läuft. Später werde ich evtl. noch mal auf deinen Vorschlag zurückkommen.

Danke´nochmals.
 
Top