Список отображаемых 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)
    }
→ Ссылка