Ответ
Использование ViewHolder для переиспользования элементов, уменьшая накладные расходы на inflate.
Фиксация размера RecyclerView с setHasFixedSize(true), если размер не меняется динамически.
Оптимизация DiffUtil вместо notifyDataSetChanged() для точечных обновлений:
val diffCallback = MyDiffCallback(oldList, newList)
val diffResult = DiffUtil.calculateDiff(diffCallback)
diffResult.dispatchUpdatesTo(adapter)
Ленивая загрузка изображений (Glide/Picasso) с отменой запросов в onViewRecycled().
Разделение сложных макетов на простые ViewTypes или использование Merge-тегов в XML.
Предзагрузка элементов с RecyclerView.LayoutManager.setInitialPrefetchItemCount().
Избегание вложенных ViewGroup (ConstraintLayout вместо RelativeLayout/LinearLayout).
Использование RecycledViewPool для нескольких RecyclerView с одинаковыми ViewHolders.