Я хочу, чтобы мой RecyclerView не перерабатывал некоторые элементы

Я использую RecyclerView с гетерогенными представлениями внутри, как показано в этом уроке.

У меня есть некоторые элементы внутри RecyclerView, которые тоже являются RecyclerView. Слишком сложно представить? Скажем, я хочу скопировать макет Play Store: один большой RecyclerView с вертикальной линейной компоновкой и заполнен множеством элементов: отдельные приложения и карусель приложений.

Если элемент для добавления - это макет для одного приложения, тогда будет использоваться идентификатор 1, и я добавлю макет для одного элемента. Иначе, если мне нужно добавить карусель, я добавлю один элемент в основной RecyclerView: еще один RecyclerView со своим адаптером.

Это работает очень хорошо. За исключением случаев, когда вы прокручиваете основной RecyclerView. Зачем? Потому что некоторые виды уничтожаются, когда они больше не видны, а затем воссоздаются в методе onBindViewHolder(). Почему здесь? Поскольку Адаптер основного RecyclerView проходит для позиции X, а затем вызывает onBindViewHolder(). Затем последний создает новый RecyclerView со своим адаптером и назначает его ему. Я бы хотел сохранить эти взгляды только потому, что они тяжело переустанавливать каждый раз.

Возможно ли это? Если да, можете ли вы сказать мне, как?

Ответ 1

Используйте это:

recyclerView.getRecycledViewPool().setMaxRecycledViews(TYPE_CAROUSEL, 0);

Это не будет перерабатывать любой вид viewType TYPE_CAROUSEL, но если количество элементов этого типа очень велико, то это значительно снизит вашу производительность, возможно, даже вызовет OOMEs

ИЗМЕНИТЬ

После прочтения ответа MML13, я думаю, это может сработать для вас. Вы беспокоитесь о том, что предметы вашей карусели будут повторно заново, когда это представление будет восстановлено во внешнем RecyclerView. Если все эти карусели имеют одинаковый тип, т.е. Все они используют один и тот же адаптер, вы можете сохранить адаптер внутри внешнего RecyclerView ViewHolder и просто поменять данные и вызвать notifyDataSetChanged() или notifyItemRangeChanged(...) на этом адаптере, когда он будет переподключен. Это переработает все виды каруселей и все виды внутри этих каруселей.

Ответ 2

Потому что некоторые виды уничтожаются, когда их больше нет, а затем воссоздан в методе onBindViewHolder().

Это неправда, они не созданы снова, они просто восстанавливаются. если у вас есть представление о позиции X (в ломе или переработчике), RecyclerView собирается использовать это и переделывать его.

Я бы хотел сохранить эти взгляды только потому, что они тяжело переустанавливать каждый раз.

Основной RecyclerView хранит их для вас. Вам нужно только изменить данные адаптера второго RecyclerView и вызвать notifyDataSetChanged. Также сохраните второй RecyclerView адаптер внутри viewHolder вашего основного RecyclerView.

Ответ 4

Установите следующую строку в своей деятельности

recyclerView.getRecycledViewPool().setMaxRecycledViews(1,0);

установить ниже код в классе RecyclerViewAdapter

@Override
    public int getItemViewType(int position) {
        return 1;
    }