Я хочу, чтобы мой 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
.
Ответ 3
Вы также можете установить код ниже в своем адаптивном адаптере onBindViewholder().
holder.setIsRecyclable(false);
Я ссылался на эту ссылку
http://aphoe.com/blog/prevent-androids-recyclerview-recycling-views/
Ответ 4
Установите следующую строку в своей деятельности
recyclerView.getRecycledViewPool().setMaxRecycledViews(1,0);
установить ниже код в классе RecyclerViewAdapter
@Override
public int getItemViewType(int position) {
return 1;
}