У меня довольно сложный список с вложенными RecyclerViews. Я понимаю, что вложенные RecyclerView не лучшее решение, но в моем случае это одно из немногих решений, которые создают структурированный код и отвечают требованиям. Прилагаю изображение конструкции. Вы можете взять Telegram в качестве примера, чтобы лучше понять структуру. В основном у меня есть внешний RecyclerView RV-1 с элементами RV-1-Item и внутренний RecyclerView RV-2 с элементами RV-2-Item. Пока все хорошо, моя проблема заключается в том, что внешний RecyclerView перерабатывает представления, как и предполагалось, но если один из элементов RV-1 попадает в поле зрения, создаются все ViewHolder RV-2 (это означает, что иногда создается более 100 ViewHolder). ). Подводя итог, мой вопрос заключается в том, как заставить внутренний RecyclerView RV-2 также перерабатывать ViewHolder.
Я знаю, что внутренний RecyclerView RV-2 должен иметь высоту wrap_content, потому что это зависит от количества внутренних элементов, также я не могу установить setHasFixedHeigth(true) (и я не знаю, поможет ли это), потому что во время выполнения новые предметы RV-2 могут быть добавлены в RV-2. Я также пытался установить setNestedScrollingEnabled(false) на RV-2, потому что много читал об этом в Интернете, но мне это тоже не помогло.
Так что в основном я так настраиваю
RV-1
layoutManager = LinearLayoutManager(context)
isNestedScrollingEnabled = false
RV-2
setHasFixedSize(true)
layoutManager = LinearLayoutManager(context).apply {
reverseLayout = true
}
В дополнение к этому у меня есть несколько ItemDecorators, но они только создают пространство между элементами, поэтому они не должны ничего делать с проблемой.
Подводя итог: внешний RV-1 перерабатывает свои ViewHolder, как и предполагалось, но внутренний RV-2 создает все ViewHolder сразу, даже если они не на экране. Я предполагаю, что это так, потому что RV-2 имеет высоту wrap_content, и когда нужно измерить layout_height, ему нужно создать все представления. ВОПРОС: Есть ли способ заставить RV-2 повторно использовать свои представления?
РЕДАКТИРОВАТЬ: Также я использую общий RecycledViewPool между всеми RV-2 RecyclerViews, но это на самом деле не связано с проблемой, потому что даже если ViewHolders совместно используются RecyclerViews, RV-2 RecyclerView не должен создавать ViewHolders, которые не t виден при инициализации.
РЕДАКТИРОВАТЬ 2: во многих комментариях и связанных вопросах говорится, что два вертикальных вложенных RecyclerViews невозможны в Android, на случай, если все посетители этого вопроса думают одинаково, мой вопрос: как бы вы реализовали такую структуру. Очевидно, что я мог бы сделать один вид, который имеет IM (Round Image View) и RV-2-Item и просто сделать IM невидимым, когда он не нужен. На мой взгляд, это как-то усложняет структуру. Кроме того, требуется, чтобы IM слева от RV-1-Item имел возможность перемещаться вверх и вниз по RV-1-Item, что, очевидно, проще с моей нынешней структурой.
РЕДАКТИРОВАТЬ 3: (Мой последний, который я обещаю). Проблема, которую я показал, может быть решена с помощью подхода, который я объясняю в своем РЕДАКТИРОВАТЬ 2, даже если это не лучшее решение, оно сработает. Но проблема в том, что у меня есть еще более сложный экран, где этот подход больше не будет работать, потому что у меня есть три вложенных RecyclerView. Я мог бы уменьшить это число до двух с помощью подхода EDIT 2, но у меня все равно остались бы два вложенных RecyclerView, и я не могу придумать обходной путь, который мог бы решить проблему оставшихся двух вложенных RecyclerView. Я приложил изображение еще более сложного экрана, который содержит интерфейс приложения с отмеченными разделами, чтобы помочь вам понять структуру.