EDIT: Per ripristinare la stessa identica posizione apparente , come in, farlo sembrare esattamente come ha fatto, dobbiamo fare qualcosa di leggermente diverso (vedi sotto come ripristinare l'esatto valore scrollY):
Salva la posizione e l'offset in questo modo:
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);
E poi ripristina lo scorrimento in questo modo:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Ciò ripristina l'elenco nella sua esatta posizione apparente . Apparente perché avrà lo stesso aspetto per l'utente, ma non avrà lo stesso valore di scorrimento (a causa di possibili differenze nelle dimensioni del layout orizzontale / verticale).
Nota che questo funziona solo con LinearLayoutManager.
--- Di seguito come ripristinare lo scorrimento esatto Y, che probabilmente renderà l'elenco diverso ---
Applica un OnScrollListener in questo modo:
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;
}
};
Ciò memorizzerà la posizione di scorrimento esatta in ogni momento in mScrollY.
Memorizza questa variabile nel tuo bundle e ripristinala in stato di ripristino su una variabile diversa , la chiameremo mStateScrollY.
Dopo il ripristino dello stato e dopo che RecyclerView ha ripristinato tutti i suoi dati, reimpostare lo scorrimento con questo:
mRecyclerView.scrollBy(0, mStateScrollY);
Questo è tutto.
Attenzione, che ripristini lo scroll su una variabile diversa, questo è importante, perché OnScrollListener verrà chiamato con .scrollBy () e successivamente imposterà mScrollY al valore memorizzato in mStateScrollY. Se non si esegue questa operazione, mScrollY avrà il doppio del valore di scorrimento (perché OnScrollListener funziona con i delta, non con gli scroll assoluti).
Il risparmio di stato nelle attività può essere ottenuto in questo modo:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
E per ripristinare chiamalo nel tuo onCreate ():
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
Il salvataggio dello stato in frammenti funziona in modo simile, ma il salvataggio dello stato effettivo richiede un po 'di lavoro extra, ma ci sono molti articoli che si occupano di questo, quindi non dovresti avere problemi a scoprire come, i principi del salvataggio dello scrollY e ripristinarlo rimane lo stesso.