#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
, но это обычное дело. Передайте все, что вам нравится, в конструктор адаптера, ваш код — единственное, что его использует! Для этого и нужен адаптер, переводящий ваши данные во что-то отображаемое