Ответ
ViewHolder и View не переиспользуются в следующих случаях:
- Изменение типа элемента – если
getItemViewType()возвращает разные значения для позиций, RecyclerView создает новые ViewHolder'ы.
override fun getItemViewType(position: Int): Int {
return if (isHeader(position)) HEADER_TYPE else ITEM_TYPE
}
-
Нехватка пула RecycledViewPool – когда скролл создает больше ViewHolder'ов, чем вмещает пул.
-
Изменение данных с notifyDataSetChanged() – RecyclerView не может сопоставить старые и новые позиции, поэтому пересоздает всё.
-
Явное удаление – при вызове методов типа
notifyItemRemoved()с последующим скроллом. -
Изменение layoutManager – при смене менеджера (например с Linear на Grid) все View пересоздаются.