Документация для разработчиков объясняет это довольно хорошо.
Это может не совсем подходить для того, что вам нужно, но это должно быть хорошим началом. В частности, я не знаю всех полей для вашего класса Todo, поэтому убедитесь, что вы учитываете эти поля в этом коде.
В принципе, вы захотите иметь ViewHolder
, который представляет ваш CardView
class TodoViewHolder(convertView: View) : RecyclerView.ViewHolder(convertView) {
val dateText = convertView.findViewById(R.id.date_text)
val description = convertView.findViewById(R.id.todo_description)
// whatever else you need access to
}
И вы захотите использовать DiffUtil
для лучшего взаимодействия с пользователем. Это позволяет использовать некоторые анимации при изменении элементов в списке, такие как удаление элемента, редактирование элемента или добавление элемента.
private class TodoDiffCallback : DiffUtil.ItemCallback<Todo>() {
override fun areItemsTheSame(oldItem: Todo, newItem: Todo) =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: Todo, newItem: Todo) =
oldItem.dateText == newItem.dateText && oldItem.description == newItem.description
}
Вы захотите расширить ListAdapter
и переопределить его методы. onCreateViewHolder
создает экземпляр вашего TodoViewHolder
для каждого видимого представления, а onBindViewHolder
позволяет вам добавить поведение к каждому элементу в списке. Стоит отметить, что вы можете передать параметр в адаптер в случае необходимости.
class MyListAdapter : ListAdapter<Todo, TodoViewHolder>(TodoDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = TodoViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.todo_recycler_view, parent, false))
override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
val todo = getItem(position)
holder.dateText = todo.dateText
holder.description = todo.description
// add whatever click listener and other stuff you need
}
}
В вашем фрагменте, когда вы получаете доступ к RecyclerView
, просто добавьте экземпляр адаптера, если он нулевой.
if (recyclerView.adapter == null) {
recyclerView.adapter = TotoListAdapter()
}
А когда вы хотите добавить данные (которые вы получили из Room или вашего API) в адаптер (во фрагменте / задании), просто сделайте следующее:
(recyclerView.adapter as? TodoListAdapter)?.submitList(data)
Обратите внимание, чтобы очистить свой стиль (вы можете использовать команду Reformat Code
в меню Code
), и вы захотите переименовать todo_recycler_view
во что-то вроде todo_view
. Вам понадобится макет RecyclerView
в макете фрагмента.