Возможно, у вас была проблема, когда 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.

Спасибо за чтение и удачи!


Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Florina Muntenescu: Restore RecyclerView scroll position

Предыдущая статьяСинхронизация Git-репозиториев в режиме реального времени
Следующая статьяTDD и обработка исключений в ASP.NET Core с помощью xUnit