EDITAR: Para restaurar exactamente la misma posición aparente , como en, hacer que se vea exactamente como lo hizo, necesitamos hacer algo un poco diferente (vea a continuación cómo restaurar el valor de scrollY exacto):
Guarde la posición y el desplazamiento de esta manera:
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);
Y luego restaure el pergamino así:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Esto restaura la lista a su posición aparente exacta . Aparente porque se verá igual para el usuario, pero no tendrá el mismo valor de scrollY (debido a posibles diferencias en las dimensiones del diseño horizontal / vertical).
Tenga en cuenta que esto solo funciona con LinearLayoutManager.
--- Debajo de cómo restaurar el scrollY exacto, lo que probablemente hará que la lista se vea diferente ---
Aplicar un OnScrollListener así:
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;
}
};
Esto almacenará la posición de desplazamiento exacta en todo momento en mScrollY.
Almacene esta variable en su Bundle y restáurela en restauración de estado a una variable diferente , la llamaremos mStateScrollY.
Después de la restauración del estado y después de que su RecyclerView haya restablecido todos sus datos, restablezca el desplazamiento con esto:
mRecyclerView.scrollBy(0, mStateScrollY);
Eso es.
Tenga cuidado, que restaure el desplazamiento a una variable diferente, esto es importante, porque el OnScrollListener será llamado con .scrollBy () y posteriormente establecerá mScrollY al valor almacenado en mStateScrollY. Si no hace esto, mScrollY tendrá el doble del valor de desplazamiento (porque OnScrollListener funciona con deltas, no con desplazamientos absolutos).
El ahorro estatal en actividades se puede lograr así:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
Y para restaurar, llame a esto en su onCreate ():
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
El guardado de estado en fragmentos funciona de manera similar, pero el guardado de estado real necesita un poco de trabajo adicional, pero hay muchos artículos que tratan sobre eso, por lo que no debería tener problemas para descubrir cómo, los principios para guardar el scrollY y restaurarlo sigue siendo el mismo.