Я пытаюсь написать базовый список Todo в Kotlin, но хотел использовать рекомендуемые рекомендации и компоненты архитектуры Android.На данный момент у меня настроена базовая архитектура, и есть список элементов RecyclerView, хранящихся в базе данных, с флажком слева и описанием справа.Пока что список автоматически обновляется при добавлении новых данных (с помощью кнопки плавающего действия).Теперь я хочу немедленно обновить запись всякий раз, когда установлен флажок для определенного элемента.
Я не могу понять, как или где установить прослушиватель флажка, чтобы передать проверенное состояние и идентификатор элемента вViewModel для обновления данных в базе данных.Я думал об определении слушателя непосредственно внутри адаптера, но потом я не могу найти способ вызвать метод обновления моего ViewModel.Но затем, если я настрою слушателя во фрагменте и передам его адаптеру, я не смогу найти способ получить идентификатор элемента.
снимок экрана списка задач
Это мой текущий фрагмент:
class ChecklistFragment : Fragment() {
private lateinit var checklistViewModel: ChecklistViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_checklist, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Set up RecyclerView
items_list.layoutManager = LinearLayoutManager(activity)
val adapter = ToDoItemAdapter(object: CompoundButton.OnCheckedChangeListener {
override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
Toast.makeText(activity, "checked", Toast.LENGTH_SHORT).show()
}
})
items_list.adapter = adapter
// Set up ViewModel
checklistViewModel = ViewModelProviders.of(this).get(ChecklistViewModel::class.java)
checklistViewModel.allToDoItems.observe(this, Observer { toDoItems ->
toDoItems?.let { adapter.setToDoItems(it) }
})
// Set up fab
add_list_item_fab.setOnClickListener {
checklistViewModel.insert(ToDoItem(description = "Item ${Random.nextInt(1,999)}", checked = Random.nextBoolean()))
}
}
}
Это мой текущий адаптер:
class ToDoItemAdapter(val onCheckedChangeListener: CompoundButton.OnCheckedChangeListener) : RecyclerView.Adapter<ToDoItemAdapter.ViewHolder>() {
private var toDoItems = emptyList<ToDoItem>()
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val checkbox: CheckBox = view.checkbox
val tvDescription: TextView = view.tv_description
fun bind(position: Int) {
checkbox.isChecked = toDoItems[position].checked
checkbox.setOnCheckedChangeListener(onCheckedChangeListener)
tvDescription.text = toDoItems[position].description
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.checklist_item, parent, false)
return ViewHolder(itemView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(position)
}
override fun getItemCount() = toDoItems.size
internal fun setToDoItems(toDoItems: List<ToDoItem>) {
this.toDoItems = toDoItems
notifyDataSetChanged()
}
}
Каков наилучший практический подход к прослушиванию отмеченных элементов и немедленному сохранению этих измененийв базе данных с использованием архитектуры MVVM?