Android listview verschwindet nach Bildschirmdrehung

8

Auf meinem Layout habe ich einige Schaltflächen, um einige Optionen zu treffen und dann eine Schaltfläche, um eine Abfrage an eine Datenbank durchzuführen. Das Ergebnis dieser Abfrage wird in ListView in diesem Layout angezeigt.

Das Problem ist, wenn ich nach der Abfrage den Bildschirm rotiere, verschwindet der ListView und muss die Abfrage erneut durchführen.

Ich glaube, dass dies passiert, weil die Aktivität neu startet. Nach den Vorschlägen hier habe ich meine Aktivität im Manifest android:configChanges="orientation|keyboardHidden" und hinzugefügt in meinem Code hinzugefügt:

%Vor%

Aber das funktioniert nicht.

Hier ist der vollständige Code meiner Aktivität:

%Vor%

Das ist seltsam, weil ich eine andere Aktivität wie diese habe:

%Vor%

Dies führt auch eine Abfrage an die Datenbank durch, zeigt sie auf einem ListView an und behandelt dann die Benutzerauswahl. Wenn ich den Bildschirm rotiere, wird ListView immer noch angezeigt.

Was kann ich tun?

    
Favolas 29.08.2012, 10:45
quelle

5 Antworten

3

Die ListView wird neu erstellt, wenn Sie setContentView in der onConfigurationChanged-Methode ausführen. Sie müssen die Daten erneut in den ListView laden. Wenn Sie den ListView an einen Adapter binden, müssen Sie dies in onConfigurationChanged tun.

    
Sameer 29.08.2012, 11:17
quelle
7

Verwenden Sie configChanges in Ihrer Aktivität in der Manifestdatei.

%Vor%

Das hat für mich funktioniert.

    
naamadheya 29.12.2015 17:23
quelle
5

Es gibt 2 Dinge, die deine Probleme lösen können:

Solver A:

  1. Fügen Sie android:configChanges="orientation|keyboardHidden" in Ihre Manifest-XML -Datei hinzu.
  2. REMOVE onConfigurationChanged(Configuration newConfig) function.

Weil onCreate() nur einmal bei jeder Initialisierung Ihrer Aktivität aufgerufen wird. Während Ihre onConfigurationChanged() die neue Ansicht R.layout.mylayout mit leeren Daten neu lädt und aufbläht = & gt; Ihre Liste wird nicht mit Daten gebunden.

Löser B:

Verschieben Sie Ihren Datenbindungscode, der in onCreate () in die überschreibende Methode onStart() oder % co_de geschrieben wurde % Ich empfehle, dass Sie onResume() für Ihren Fall der Datenbindung verwenden.

Sie sollten die Entwicklerseite onStart() sehen / p>

(Aktualisieren):

Weil Sie Ihre Android Activity life cycle beim Klicken auf eine Suchschaltfläche auf dem Listenelement laden, müssen Sie die Daten innerhalb der Aktivität pflegen, um die Liste daraus neu aufzubauen (z. B. eine Suchfolge). Dann erstellen Sie in listContent Ihre Liste aus diesen Daten neu.

Es ist jedoch ziemlich seltsam von Ihrer Logik, wenn Sie auf ein Listenelement klicken, um die gesamte Liste selbst zu ändern. Und beachte, dass onStart() auch ausgelöst wird, wenn auf eine Schaltfläche auf dem Listenelement geklickt wird.

    
Kelvin Trinh 29.08.2012 11:37
quelle
2

Sie müssen onSaveInstanceState und onRestoreInstanceState

überschreiben

Speichern Sie in der onSaveInstanceState die ListView Liste auf Bundle .

Stellen Sie in onRestoreInstanceState die Liste mit Bundle wieder her und erstellen Sie den Adapter neu.

%Vor%     
mabg 04.04.2014 01:05
quelle
-1

Sie müssen die Abfrage wiederholen (wenn Sie sie nicht speichern), wenn Sie eine Orientierungsänderung vornehmen, denn wenn dies erledigt ist, wird oncreate erneut aufgerufen.

Sie könnten versuchen, die Daten zu speichern, die sich in Ihrer Listenansicht befinden, etwa in gemeinsamen Einstellungen.

    
Anders Metnik 29.08.2012 10:56
quelle