Pflegen / Speichern / Wiederherstellen der Bildlaufposition beim Zurückkehren zu einer ListView
Ich habe eine lange ListView
dass der Benutzer scrollen, um vor der Rückkehr zum vorherigen Bildschirm. Wenn der Benutzer öffnet diese ListView
wieder, ich will die Liste gescrollt werden um den gleichen Punkt, den es vorher war. Irgendwelche Ideen auf, wie dies zu erreichen?
InformationsquelleAutor der Frage rantravee | 2010-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
Erklärung:
ListView.getFirstVisiblePosition()
gibt den oberen sichtbaren Liste. Aber dieses Element kann teilweise gescrollt außer Sicht, und wenn Sie wiederherstellen möchten, die genaue scroll-position der Liste, die Sie brauchen, um dieses offset. SoListView.getChildAt(0)
gibt dieView
für die top-list-item, und dannView.getTop() - mList.getPaddingTop()
gibt den relativen offset von der Spitze desListView
. Dann, zur Wiederherstellung derListView
's scroll-position, nennen wirListView.setSelectionFromTop()
mit dem index des Elements, wir wollen und einen Versatz zu der position der oberen Kante von der Spitze desListView
.InformationsquelleAutor der Antwort ian
InformationsquelleAutor der Antwort Eugene Mymrin
Nahm ich die Lösung von @(Kirk Woll), und es funktioniert für mich. Ich habe auch gesehen, in den Android-source-code für die app "Kontakte", dass Sie verwenden eine ähnliche Technik. Ich möchte hinzufügen, einige weitere details:
Oben auf meiner ListActivity abgeleitet Klasse:
Dann, einige Methode überschreibt:
Natürlich "loadData" ist meine Funktion zum abrufen der Daten aus der DB und legen Sie es auf die Liste.
Auf meinem Froyo-Gerät, das funktioniert sowohl bei einer änderung der Telefon-Orientierung, und wenn Sie ein Element Bearbeiten, und gehen Sie zurück zu der Liste.
InformationsquelleAutor der Antwort Giorgio Barchiesi
Sehr einfache Weise:
Die Methode setSelection zurücksetzen) setzt die Liste an der gelieferten Sache. Wenn nicht im touch-Modus wird der Artikel ausgewählt werden, wenn im touch-Modus wird das Element nur positioniert werden, auf dem Bildschirm.
Einen komplizierteren Ansatz:
InformationsquelleAutor der Antwort Francesco Laurita
Fand ich etwas Interessantes über diese.
Versuchte ich setSelection und scrolltoXY aber es hat nicht funktioniert, die Liste blieb in der gleichen position, nachdem einige Versuch und Irrtum, ich habe folgenden code, der funktioniert
Wenn statt der Entsendung der Runnable Sie versuchen runOnUiThread es funktioniert entweder nicht (zumindest bei einigen Geräten)
Dies ist eine sehr seltsame workaround für etwas, das sollte unkompliziert sein.
InformationsquelleAutor der Antwort shalafi
ACHTUNG!! Es ist ein Fehler in AbsListView, die nicht zulässt, dass die onSaveState() funktionieren, wenn das ListView-Steuerelement.getFirstVisiblePosition() ist 0.
So, Wenn Sie große Bilder, dass die meisten des Bildschirms, und Blättern Sie auf das zweite Bild, aber ein wenig von der ersten zeigt, ist die scroll-position wird nicht gespeichert...
vom AbsListView.java:1650 (Kommentare von mir)
Aber in dieser situation, die " top " in dem code unten, wird eine negative Zahl, die bewirkt, dass andere Probleme, die verhindern, dass der Zustand wiederhergestellt werden, richtig. Also, wenn 'top' negativ ist, bekommen das nächste Kind
InformationsquelleAutor der Antwort aaronvargas
Genug,
InformationsquelleAutor der Antwort Leo Phan
Für einige auf der Suche nach einer Lösung für dieses problem, die Wurzel des Problems sein kann, wo Sie Ihre Listen-Ansichten-adapter. Nachdem Sie den adapter an den listview, es setzt die scroll-position. Nur etwas zu prüfen. Ich bewegte mich die Einstellung der adapter in mein onCreateView nach schnappen wir uns den Verweis auf das listview-Steuerelement, und es löste das problem für mich. =)
InformationsquelleAutor der Antwort Ryan Newsom
Bin dieses posting, weil ich bin überrascht, niemand erwähnt hatte.
Nachdem der Benutzer auf die Schaltfläche zurück klickt er wieder der listview in der gleichen Zustand, wie er ging.
Dieser code überschreiben Sie die "up" - Taste, um Verhalten sich auf die gleiche Weise wie die Taste zurück, so im Fall der Listview -> Details -> Zurück zum Listview (und keine anderen Optionen) dies ist der einfachste code zu erhalten die scrollposition und die Inhalte in der Listenansicht.
Achtung: Wenn Sie können, gehen Sie zu einer anderen Aktivität über die details der Aktivität der up-Taste kehren Sie wieder um, die Aktivität, so haben Sie zu manipulieren, das backbutton-Geschichte, um für diese zu arbeiten.
InformationsquelleAutor der Antwort Mazvél
Ist nicht einfach
android:saveEnabled="true"
im ListView-xml-Deklaration genug?InformationsquelleAutor der Antwort Andrea Richiardi
BESTE LÖSUNG IST:
RUFEN SIE IN DER POST UND IM THREAD!
InformationsquelleAutor der Antwort Andrew Sneck
Pflegen Sie die scroll-Zustand nach einem reload, wenn Sie den Zustand sichern, bevor du neu laden und es wieder nach. In meinem Fall machte ich eine asynchrone Netzwerk-Anfrage und reloaded die Liste in einem Rückruf, nachdem es abgeschlossen. Dies ist, wo ich Zustand wiederherstellen. Code-Beispiel ist Kotlin.
InformationsquelleAutor der Antwort Michael Peterson
Wenn Sie mit Fragmenten gehostet auf eine Aktivität, die Sie tun können, so etwas wie dieses:
InformationsquelleAutor der Antwort saulobrito
Wenn Sie speichern/wiederherstellen die scroll-position von
ListView
selbst Sie sind im wesentlichen dupliziert die Funktionalität bereits implementiert ist in android-framework. DieListView
stellt feine scroll-position nur gut auf seine eigene, mit Ausnahme einer Einschränkung: wie @aaronvargas erwähnt, gibt es einen bug inAbsListView
die nicht zulassen, wiederherstellen feine scroll-position für das erste Listenelement. Dennoch ist der beste Weg, um restore scroll position nicht, um es wiederherzustellen. Android framework wird es besser für Sie. Nur sicherstellen, dass Sie erfüllt die folgenden Bedingungen:setSaveEnabled(false)
Methode und nichtandroid:saveEnabled="false"
Attribut für die Liste in der xml-layout-DateiExpandableListView
überschreibenlong getCombinedChildId(long groupId, long childId)
Methode, so dass es gibt positive long-Zahl (default-Implementierung in der KlasseBaseExpandableListAdapter
gibt negative Zahl). Hier sind Beispiele:.
ListView
oderExpandableListView
verwendet wird, in einem fragment nicht neu das fragment auf Aktivität Erholung (nach Bildschirm-rotation zum Beispiel). Erhalten Sie das fragment mitfindFragmentByTag(String tag)
Methode.ListView
hat eineandroid:id
- und es ist einzigartig.Zu vermeiden oben genannten Nachteil mit dem ersten Punkt der Liste können Sie Handwerk und dem adapter die Art und Weise es gibt spezielle dummy-null Pixel Höhe-Ansicht für die
ListView
an position 0.Hier ist das einfache Beispiel-Projekt zeigt
ListView
undExpandableListView
wieder Ihren feinen Blättern Positionen in der Erwägung, dass Ihre scroll-Positionen werden nicht gespeichert/wiederhergestellt. Feine scroll-position wird wiederhergestellt, perfekt auch für die komplexen Szenarien, die mit temporären Wechsel zu einer anderen Anwendung, Doppel-Bildschirm-rotation und den Wechsel zurück zur test-Anwendung. Bitte beachten Sie, falls Sie ausdrücklich, die Anwendung zu beenden (durch drücken der Zurück-Taste) die scroll-position wird nicht gespeichert (wie auch alle anderen Ansichten wird nicht speichern Ihren Zustand).https://github.com/voromto/RestoreScrollPosition/releases
InformationsquelleAutor der Antwort Sergey
Einer Aktivität abgeleitet von ListActivity implementiert LoaderManager.LoaderCallbacks mit einem SimpleCursorAdapter es nicht funktioniert hat, wiederherstellen der position in onReset(), denn die Aktivität war fast immer neu gestartet und der adapter wurde neu geladen, wenn Sie die Detailansicht geschlossen wurde. Der trick war, wiederherstellen der position in onLoadFinished():
in onListItemClick():
in onLoadFinished():
in onBackPressed():
InformationsquelleAutor der Antwort Perotin
Weder von den Lösungen, die hier angeboten werden, schien für mich arbeiten. In meinem Fall habe ich eine
ListView
imFragment
denen ich mich austauschen in einerFragmentTransaction
so dass ein neuerFragment
Instanz wird jedes mal erstellt, wenn das fragment angezeigt wird, was bedeutet, dass dieListView
- Status kann nicht gespeichert werden, der als Mitglied derFragment
.Stattdessen landete ich speichern den Zustand in meinem custom
Application
Klasse. Der code unten sollte Ihnen eine Idee geben, wie das funktioniert:Die grundlegende Idee ist, dass Sie speichern den Zustand außerhalb der fragment-Instanz. Wenn Sie nicht wie die Idee des habens eines statischen Feldes in Ihrer Anwendung Klasse, ich denke Sie könnten es tun, durch die Implementierung eines fragment-interface und speichern Sie den Zustand in Ihrer Aktivität.
Andere Lösung wäre, um es zu speichern in
SharedPreferences
aber es wird ein wenig komplizierter, und Sie müssen sicherstellen, dass Sie klar, dass es beim Start der Anwendung, es sei denn, Sie möchten, dass der Zustand beibehalten werden über app-Starts.Auch, zu vermeiden, die "scroll-position nicht gespeichert, wenn der erste Punkt ist sichtbar" können Sie die Anzeige eines dummy ersten Artikel mit
0px
Höhe. Dies kann erreicht werden durch überschreibengetView()
Sie den adapter, wie diesen:InformationsquelleAutor der Antwort BadCash