Ich habe eine lange ListView
dass der Benutzer einen Bildlauf durchführen kann, bevor er zum vorherigen Bildschirm zurückkehrt. Wenn der Benutzer diese Seite öffnet ListView
Ich möchte, dass die Liste wieder an die gleiche Stelle wie zuvor gescrollt wird. Irgendwelche Ideen, wie man das erreichen kann?
Antworten
Zu viele Anzeigen?ACHTUNG!! Es gibt einen Fehler in AbsListView, der es nicht erlaubt, dass onSaveState() korrekt funktioniert, wenn ListView.getFirstVisiblePosition() 0 ist.
Wenn Sie also große Bilder haben, die den größten Teil des Bildschirms einnehmen, und Sie zum zweiten Bild scrollen, aber nur ein kleiner Teil des ersten Bildes zu sehen ist, wird die Bildlaufposition nicht gespeichert...
von AbsListView.java:1650 (Kommentare von mir)
// this will be false when the firstPosition IS 0
if (haveChildren && mFirstPosition > 0) {
...
} else {
ss.viewTop = 0;
ss.firstId = INVALID_POSITION;
ss.position = 0;
}
In diesem Fall ist "top" im nachstehenden Code jedoch eine negative Zahl, die andere Probleme verursacht, die eine korrekte Wiederherstellung des Zustands verhindern. Wenn "top" also negativ ist, holen Sie das nächste Kind
// save index and top position
int index = getFirstVisiblePosition();
View v = getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
if (top < 0 && getChildAt(1) != null) {
index++;
v = getChildAt(1);
top = v.getTop();
}
// parcel the index and top
// when restoring, unparcel index and top
listView.setSelectionFromTop(index, top);
Für einige, die nach einer Lösung für dieses Problem suchen, kann die Wurzel des Problems darin liegen, wo Sie Ihren Adapter für Listenansichten einstellen. Nachdem Sie den Adapter auf die listview gesetzt, es setzt die Scroll-Position. Nur etwas zu bedenken. Ich habe die Einstellung des Adapters in mein onCreateView verschoben, nachdem wir den Verweis auf die Listenansicht geholt haben, und das Problem ist für mich gelöst =)
private Parcelable state;
@Override
public void onPause() {
state = mAlbumListView.onSaveInstanceState();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
if (getAdapter() != null) {
mAlbumListView.setAdapter(getAdapter());
if (state != null){
mAlbumListView.requestFocus();
mAlbumListView.onRestoreInstanceState(state);
}
}
}
Das ist genug
Ich poste dies, weil ich überrascht bin, dass dies noch niemand erwähnt hat.
Nachdem der Benutzer auf die Schaltfläche "Zurück" geklickt hat, kehrt er zur Listenansicht zurück, und zwar in dem Zustand, in dem er sie verlassen hat.
Dieser Code wird die Schaltfläche "nach oben" überschreiben, damit sie sich genauso verhält wie die Schaltfläche "Zurück". Im Falle von Listview -> Details -> Zurück zur Listview (und keinen anderen Optionen) ist dies der einfachste Code, um die Bildlaufposition und den Inhalt in der Listview zu erhalten.
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return(true);
}
return(super.onOptionsItemSelected(item)); }
Vorsicht! Wenn Sie von der Detailaktivität aus zu einer anderen Aktivität wechseln können, kehren Sie mit der Schaltfläche "Nach oben" zu dieser Aktivität zurück, so dass Sie den Verlauf der Schaltfläche "Zurück" ändern müssen, damit dies funktioniert.