РЕДАГУВАТИ: Щоб відновити ту ж саму видиму позицію, що і в, щоб вона виглядала точно так, як це було, нам потрібно зробити щось дещо інше (див. Нижче, як відновити точне значення 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);
Це повертає список до його точного видимого положення. Мабуть, тому що це буде виглядати однаково для користувача, але воно не матиме однакового значення прокруткиY (через можливі відмінності в розмірах ландшафту / портрета).
Зверніть увагу, що це працює лише з LinearLayoutManager.
--- Нижче, як відновити точну прокрутку Y, що, ймовірно, призведе до того, що список виглядатиме по-іншому ---
Застосуйте 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.
Збережіть цю змінну у своєму пакеті та відновіть її у відновленні стану до іншої змінної , ми будемо називати її 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);
}
Збереження стану у фрагментах працює подібним чином, але для фактичного збереження стану потрібно трохи додаткової роботи, але є багато статей, що займаються цим, тому у вас не повинно виникнути проблем із з’ясуванням принципів збереження прокруткиY і відновлення його залишається незмінним.