Как RecyclerView рендерит элементы: только видимые или все
Что проверяют
Знаете ли вы механизм переиспользования, а не только само слово. Правильный ответ: создаются и привязываются только видимые элементы плюс небольшой запас. Следом спрашивают, какие бывают кэши и когда RecyclerView внезапно создаёт все элементы сразу.
Как отвечать
Раскладкой занимается LayoutManager: он заполняет экран элементами и при прокрутке запрашивает новые у Recycler. Всего списка в памяти нет, есть примерно столько ViewHolder, сколько помещается на экран, и немного сверху.
Откуда Recycler берёт холдер, по порядку:
- scrap: элементы, временно отсоединённые во время перераскладки. Возвращаются без повторной привязки;
- кэш вьюх (
mCachedViews): только что ушедшие за край элементы, по умолчанию два. Если пользователь прокрутил назад, элемент вернётся безonBindViewHolder. Размер меняется черезsetItemViewCacheSize; RecycledViewPool: пул по типам вьюх, по умолчанию пять на тип. Отсюда холдер берётся уже с вызовомonBindViewHolder, размер задаётsetMaxRecycledViews;onCreateViewHolder: только когда всё выше пусто.
Дополнительно работает GapWorker: в свободное время кадра он заранее создаёт и привязывает элемент, который вот-вот появится, чтобы прокрутка не дёргалась. Для вложенных горизонтальных списков помогают setInitialPrefetchItemCount и общий RecycledViewPool на все вложенные RecyclerView.
Точечные обновления через ListAdapter и DiffUtil вместо notifyDataSetChanged() сохраняют анимации и не перепривязывают весь экран.
Где спотыкаются
Кладут RecyclerView с высотой wrap_content внутрь NestedScrollView. Родитель даёт неограниченную высоту, список раскладывает все элементы сразу, и на тысяче строк экран подвисает.
Не сбрасывают состояние в onBindViewHolder. Если галочка ставится при true и не снимается при false, переиспользованный элемент покажет чужую отметку.
Делают тяжёлую работу в onBindViewHolder: декодируют картинки или форматируют даты на главном потоке. Привязка вызывается постоянно при прокрутке, такие операции отдают загрузчику изображений или готовят заранее.