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





