BEARBEITEN: Um genau die gleiche scheinbare Position wie in wiederherzustellen , damit sie genau so aussieht wie sie, müssen wir etwas anderes tun (siehe unten, wie der genaue scrollY-Wert wiederhergestellt wird):
Speichern Sie die Position und den Versatz wie folgt:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
int firstItem = manager.findFirstVisibleItemPosition();
View firstItemView = manager.findViewByPosition(firstItem);
float topOffset = firstItemView.getTop();
outState.putInt(ARGS_SCROLL_POS, firstItem);
outState.putFloat(ARGS_SCROLL_OFFSET, topOffset);
Und stellen Sie dann die Schriftrolle wie folgt wieder her:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Dadurch wird die Liste an ihrer exakten scheinbaren Position wiederhergestellt . Anscheinend, weil es für den Benutzer gleich aussieht, aber nicht den gleichen scrollY-Wert hat (wegen möglicher Unterschiede in den Abmessungen des Quer- / Hochformat-Layouts).
Beachten Sie, dass dies nur mit LinearLayoutManager funktioniert.
--- Nachfolgend erfahren Sie, wie Sie den exakten Bildlauf wiederherstellen, wodurch die Liste wahrscheinlich anders aussieht ---
Wenden Sie einen OnScrollListener wie folgt an:
private int mScrollY;
private RecyclerView.OnScrollListener mTotalScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mScrollY += dy;
}
};
Dadurch wird die genaue Bildlaufposition jederzeit in mScrollY gespeichert.
Speichern Sie diese Variable in Ihrem Bundle und stellen Sie sie in der Statuswiederherstellung in einer anderen Variablen wieder her . Wir nennen sie mStateScrollY.
Nach der Wiederherstellung des Status und nachdem Ihr RecyclerView alle Daten zurückgesetzt hat, setzen Sie den Bildlauf folgendermaßen zurück:
mRecyclerView.scrollBy(0, mStateScrollY);
Das ist es.
Beachten Sie, dass Sie den Bildlauf in einer anderen Variablen wiederherstellen. Dies ist wichtig, da der OnScrollListener mit .scrollBy () aufgerufen wird und anschließend mScrollY auf den in mStateScrollY gespeicherten Wert setzt. Wenn Sie dies nicht tun, hat mScrollY den doppelten Bildlaufwert (da der OnScrollListener mit Deltas arbeitet, nicht mit absoluten Bildläufen).
Staatliche Einsparungen bei Aktivitäten können wie folgt erreicht werden:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
Und um es wiederherzustellen, rufen Sie dies in Ihrem onCreate () auf:
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
Das Speichern von Zuständen in Fragmenten funktioniert auf ähnliche Weise, aber das Speichern von Zuständen erfordert ein wenig zusätzliche Arbeit, aber es gibt viele Artikel, die sich damit befassen. Sie sollten also kein Problem damit haben, herauszufinden, wie die Prinzipien zum Speichern des scrollY funktionieren und die Wiederherstellung bleiben gleich.