РЕДАКТИРОВАТЬ: Чтобы восстановить точно такое же видимое положение, как в, чтобы оно выглядело точно так, как оно было, нам нужно сделать что-то немного другое (см. Ниже, как восстановить точное значение scrollY):
Сохраните положение и смещение следующим образом:
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);
А затем восстановите свиток вот так:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Это восстанавливает список в его точное видимое положение. Очевидно, потому что он будет выглядеть одинаково для пользователя, но у него не будет такого же значения scrollY (из-за возможных различий в размерах макета альбомной / книжной ориентации).
Обратите внимание, что это работает только с LinearLayoutManager.
--- Ниже показано, как восстановить точный scrollY, который, вероятно, изменит внешний вид списка ---
Примените OnScrollListener следующим образом:
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;
}
};
При этом в mScrollY всегда будет сохраняться точное положение прокрутки.
Сохраните эту переменную в своем Bundle и восстановите ее при восстановлении состояния в другую переменную , мы назовем ее mStateScrollY.
После восстановления состояния и после того, как ваш RecyclerView сбросил все свои данные, сбросьте прокрутку следующим образом:
mRecyclerView.scrollBy(0, mStateScrollY);
Вот и все.
Помните, что вы восстанавливаете прокрутку для другой переменной, это важно, потому что OnScrollListener будет вызываться с помощью .scrollBy () и впоследствии установит mScrollY на значение, хранящееся в mStateScrollY. Если вы этого не сделаете, mScrollY будет иметь двойное значение прокрутки (потому что OnScrollListener работает с дельтами, а не с абсолютной прокруткой).
Экономия состояния в действиях может быть достигнута так:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
И для восстановления вызовите это в своем onCreate ():
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
Сохранение состояния во фрагментах работает аналогичным образом, но фактическое сохранение состояния требует немного дополнительной работы, но есть много статей, посвященных этому, поэтому у вас не должно возникнуть проблем с выяснением того, как, принципы сохранения scrollY и восстановление остается прежним.