Как я могу слушать onCheckedChangeListener в RecyclerView, используя MVVM? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь написать базовый список 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?

1 Ответ

0 голосов
/ 27 февраля 2019

Если вы хотите щелкнуть или проверить что-то в RecyclerView Item,

Существует элегантный способ для этого.

class MyAdapter(val viewModel : ViewModel) : RecyclerView.ViewModel<ViewHolder>{

fun onCreateViewModel(..){
     val binding = ItemRecyclerViewBinding.inflate(LayoutInflater.from(parent.context), parent,false)
    binding.vm = viewModel
}
}

в XML

<data>
    <variable name="vm" type="YourViewModel"/
    <variable name="yourItem" type="YourItem"/
</data>
<FrameLayout or something
    android:onClick = "@{(view) -> vm.onClickItem(view, yourItem)}">

</FrameLayout>

вViewModel Class,

fun onClickItem(view : View, yourItem : YourItem){
    Log.e(TAG,"$view is clicked with $yourItem")
}

Я пишу о о том, как прослушивать щелчки или проверять события из элементов повторного просмотра

Если вы хотите сохранить эти данные в БД, вы можетеиспользуйте свою собственную процедуру для этого в классе ViewModel

Удачного кодирования!

...