Возможно, у вас была проблема, когда RecyclerView
терял позицию прокрутки при повторном создании Activity
/Fragment
. Обычно это происходит из-за того, что данные Adapter
загружаются асинхронно и не успевают к тому времени, когда RecyclerView
должен выполнить разметку, поэтому он не может восстановить положение прокрутки.
Начиная с версии 1.2.0-alpha02
, RecyclerView
предлагает новый API для восстановления макета блока Adapter
до тех пор, пока он не будет готов.
Восстановление положения прокрутки
Существует несколько способов обеспечить правильное положение прокрутки. Лучше всего убедитесь, что вы всегда устанавливаете данные на Adapter
перед первой загрузкой макета, кэшируя данные, которые вы хотите отобразить в памяти, в ViewModel
или в репозитории. Если этот подход невозможен, другие решения более сложные. Например, если отказаться от установки Adapter
на RecyclerView
, то это может привести к проблемам с такими элементами, как заголовки, или к неправильному использованию LayoutManager.onRestoreInstanceState
API.
Решение recyclerview:1.2.0-alpha02
представляет собой новый метод Adapter
, который позволяет задать политику восстановления состояния (через перечисление StateRestorationPolicy
). Имеется три варианта:
ALLOW
— состояние по умолчанию при следующей загрузке макета, которое немедленно восстанавливает состояниеRecyclerView
;PREVENT_WHEN_EMPTY
— восстанавливает состояниеRecyclerView
только тогда, когда адаптер не пуст (adapter.getItemCount() > 0
). Если данные загружаются асинхронно,RecyclerView
ждет, пока они не будут загружены, и только потом восстанавливает состояние. Если у вас есть элементы по умолчанию, такие как заголовки или индикаторы хода загрузки как частьAdapter
, то следует использовать опциюPREVENT
, если только элементы по умолчанию не добавляются с помощьюMergeAdapter
.MergeAdapter
ждет готовности всех адаптеров и только затем восстанавливает состояние.PREVENT
— восстановление всех состояний откладывается до тех пор, пока вы не установитеALLOW
илиPREVENT_WHEN_EMPTY
.
Установите политику восстановления состояния на адаптере следующим образом:
adapter.stateRestorationPolicy = PREVENT_WHEN_EMPTY
Вот и все! Теперь вы знаете про функцию простого восстановления состояния RecyclerView
.
Спасибо за чтение и удачи!
Читайте также:
- Новейшие возможности C# 9
- Использование методов расширения в C# для элегантного и плавного кода
- Игра на C# меньше 8 Кб
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Florina Muntenescu: Restore RecyclerView scroll position