Список отображаемых View или Fragment
Есть большой вертикальный LinearLayout, который содержит фрагменты 100-200 штук и до бесконечности, разных размеров. У них есть id от 1 до Количества этих фрагментов. Как реализовать запоминание, на каком фрагменте остановился просмотр? Не могу сообразить как получить список только отображаемых фрагментов, вью или еще хоть что то. И соответственно, как при открытии перейти к последнему открытому фрагменту?
Например, отмотал к 36 элементу, решил выйти, потом решил вернуться, и чтобы открылась разметка сразу с 36 эелемента.
Спасибо.
UDP Нашел из этого выход, сделал вместо фрагментов, вьюшки. Запихал их в ScrollView. Те, кто наткнётся, подскажите, скрол вью экономит память как Recycler? Мне и тем кто наткнётся пригодится
Ответы (1 шт):
Это крайне плохое решение. Размещение сотен крупных элементов внутри ScrollView легко может привести к израсходованию доступной памяти и вылету программы с OutOfMemory, не говоря уже про тормоза при прокрутке.
Использовать сотни фрагментов вам с вероятностью 99.99% нее требуется. Как вам следует сделать. Во-первых, избавится от фрагментов в таком количестве. Они просто не приспособлены для такой работы. Вместо них делайте обычные кастомные вьюшки. Во-вторых, используйте RecyclerView для размещения элементов. Он сильно облегчит жизнь системе, обрабатываться и хранится в памяти будут только те вьюшки, которые реально отображаются, а это 3-10 штук вместо 300.
Если использование фрагментов почему-то обязательно в вашем случае(а я готов поспорить, что это не так), то можете в RecyclerView размещать ViewHolder-ы с контейнером, в который прикрепляете нужный фрагмент в onBindViewHolder, не забывая откреплять оттуда тот, который был прикреплен в эту вьюшку до этого. Но еще раз повторюсь, это не должно требоваться с подавляющем большинстве случаев
Для сохранения запоминая прокрутки в RecyclerView сохраняйте состояние его LayoutManager. Скажем, в onPause(). А в onResume восстанавливайте из него, если есть из чего восстанавливать
private var savedState: Parcelable? = null
override fun onPause() {
super.onPause()
savedState = (list?.layoutManager as? LinearLayoutManager)?.onSaveInstanceState()
}
override fun onResume() {
super.onResume()
if (savedState != null)
(list?.layoutManager)?.onRestoreInstanceState(savedState)
}