414 Stimmen

Beibehalten/Speichern/Wiederherstellen der Bildlaufposition bei der Rückkehr zu einer ListView

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?

11voto

aaronvargas Punkte 10019

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);

7voto

Ryan Newsom Punkte 696

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 =)

6voto

Leo Phan Punkte 61
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

1voto

Mazvél Punkte 911

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.

1voto

Andrea Richiardi Punkte 673

Ist nicht einfach android:saveEnabled="true" in der ListView-Xml-Deklaration aus?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X