EDITAR: Para restaurar exatamente a mesma posição aparente , como em, fazer com que pareça exatamente como estava, precisamos fazer algo um pouco diferente (veja abaixo como restaurar o valor exato de scrollY):
Salve a posição e desloque assim:
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 então restaure o pergaminho assim:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Isso restaura a lista à sua posição aparente exata . Aparente porque terá a mesma aparência para o usuário, mas não terá o mesmo valor scrollY (devido a possíveis diferenças nas dimensões do layout paisagem / retrato).
Observe que isso só funciona com LinearLayoutManager.
--- Abaixo, como restaurar o scrollY exato, o que provavelmente fará a lista parecer diferente ---
Aplique um OnScrollListener assim:
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;
}
};
Isso armazenará a posição de rolagem exata o tempo todo em mScrollY.
Armazene essa variável em seu pacote e restaure-a na restauração do estado para uma variável diferente , vamos chamá-la de mStateScrollY.
Após a restauração do estado e depois que o RecyclerView redefinir todos os seus dados, redefina a rolagem com isto:
mRecyclerView.scrollBy(0, mStateScrollY);
É isso aí.
Cuidado, que você restaure a rolagem para uma variável diferente, isso é importante, porque o OnScrollListener será chamado com .scrollBy () e, subsequentemente, definirá mScrollY com o valor armazenado em mStateScrollY. Se você não fizer isso, mScrollY terá o dobro do valor de rolagem (porque OnScrollListener funciona com deltas, não com rolagens absolutas).
A economia de estado em atividades pode ser alcançada desta forma:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
E para restaurar, chame isso em seu onCreate ():
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
O salvamento do estado em fragmentos funciona de maneira semelhante, mas o salvamento do estado real precisa de um pouco mais de trabalho, mas há muitos artigos que tratam disso, então você não deve ter problemas para descobrir como, os princípios de salvar o pergaminho. e restaurá-lo permanece o mesmo.