Общий вопрос о RecycleView.Адаптер

#android #kotlin

#Android #kotlin

Вопрос:

У меня очень общий вопрос об адаптерах. У меня есть такой код:

 class DailySumsAdapter(private val dailySumList : List<Pair<String, Double>>, private val context : Context) : RecyclerView.Adapter<DailySumHolder>()
{
   ....
}
  

Список пар — это то, что я использую для заполнения полей ViewHolders.
Должен ли я передавать объект списка в конструктор DailySumsAdapter или адаптеры могут работать с другими типами данных?
Я спрашиваю, потому что замечаю, что метод onBindViewHolder() использует аргумент «position» при доступе к данным:

 override fun onBindViewHolder(holder: DailySumHolder, position: Int) { ....}
  

Комментарии:

1. Да, просто передайте список пар в конструкторе адаптера. Нет проблем.

Ответ №1:

Должен ли я передавать объект List в конструктор DailySumsAdapter или адаптеры могут работать с другими типами данных

да, вы должны передать этот объект. адаптер использует дженерики для обеспечения передачи определенного типа данных.

Я спрашиваю, потому что замечаю, что метод onBindViewHolder() использует аргумент «position» при доступе к данным

Данные, хранящиеся в адаптере, относятся к типу collection, поэтому позиция используется только для доступа к данным в определенном месте в коллекции. Возьмите позицию в качестве идентификатора этой строки в списке.

Комментарии:

1. Отлично! Спасибо 🙂 Это отлично отвечает на мой вопрос.

Ответ №2:

Адаптер — это мост между вашим источником данных и тем, что его отображает (в данном случае «держатель представления» в a RecyclerView ). Ваш источник данных может быть любым, каким вам нравится, но, как правило, это будет какой-то упорядоченный список / последовательность элементов, потому что именно так он отображается.

С помощью a RecyclerView.Adapter вам действительно нужно беспокоиться только о трех вещах:

  • onCreateViewHolder он же «раздуть макет для отображения материала»
  • onBindViewHolder он же «помещает материал в макет, отображая элемент в позиции X«
  • getItemCount он же «сколько вещей в списке»

(позиция X — это немного сложная часть, потому что вы можете отображать подмножество ваших фактических исходных данных, например, если они отфильтрованы из-за поиска. Итак, в этом случае вам может потребоваться перевести позицию X в отображаемом списке в элемент Y в ваших исходных данных)

Фактический RecyclerView.ViewHolder (который является общим типом вашего адаптера), который вы реализуете, может содержать в себе все, что угодно — на самом деле вам просто нужно передать раздутый макет суперклассу, это единственное требование. В основном вы будете просто просматривать представления для отображения объектов, чтобы вы могли их обновлять onBindViewHolder .

Так что нет, вам вообще не нужно использовать a List , но это обычное дело. Передайте все, что вам нравится, в конструктор адаптера, ваш код — единственное, что его использует! Для этого и нужен адаптер, переводящий ваши данные во что-то отображаемое