Что такое адаптер в RecyclerView и какие основные функции он выполняет
Что проверяют
Понимаете ли вы, как адаптер делит работу с RecyclerView: список сам решает, когда и какие элементы нужны, а адаптер только создаёт и наполняет их. Следом почти всегда спрашивают про обновление данных: почему notifyDataSetChanged() плох и что использовать вместо него.
Как отвечать
Адаптер это мост между набором данных и видимыми элементами. Он наследуется от RecyclerView.Adapter<VH> и обязан реализовать три метода:
onCreateViewHolder(): создаёт View из разметки и оборачивает его вViewHolder. Вызывается редко, только когда в пуле нет готового holder нужного типа;onBindViewHolder(): кладёт данные конкретной позиции в уже существующий holder. Вызывается постоянно при прокрутке, поэтому здесь не место тяжёлым вычислениям и созданию объектов;getItemCount(): сколько элементов в наборе.
Для разнородных списков (заголовки, карточки разного вида) есть getItemViewType().
Отдельно расскажите про обновления. Точечные notifyItemInserted(), notifyItemRemoved(), notifyItemChanged() дают анимации и не перерисовывают весь список. На практике разницу считает DiffUtil, а удобнее всего ListAdapter с DiffUtil.ItemCallback: вы вызываете submitList(), и сравнение идёт в фоновом потоке. Чтобы склеить несколько адаптеров подряд (шапка, список, футер), есть ConcatAdapter, для постраничной загрузки PagingDataAdapter из Paging 3.
Расположением элементов адаптер не занимается: это задача LayoutManager, а хранением переиспользуемых holder занят RecycledViewPool.
Где спотыкаются
Путают роли методов и говорят, что onCreateViewHolder() вызывается для каждой позиции. Из-за этого привязку данных кладут туда, и после прокрутки в строках появляются чужие значения.
Вызывают notifyDataSetChanged() на любое изменение. Список мигает, пропадают анимации, а на больших списках это ещё и заметная нагрузка.
Вешают слушатель клика в onBindViewHolder() с захватом position из параметра. К моменту нажатия позиция может устареть. Правильнее вешать слушатель один раз при создании holder и брать bindingAdapterPosition в момент клика, проверяя его на RecyclerView.NO_POSITION.