是ViewModel还是Fragment中的OnClickListener和OnLongClickListener



是否为recyclerView的onClickListener和onLongClickListener在ViewModel或Fragment中查看项目?为什么?

第一个从视图获取ClickListener模型:

class MyFragment : Fragment() {
...
private fun setUpAdapter() = MyAdapter({ todoEntity, todoTitle ->
viewModel.onClickListener(todoEntity, todoTitle)
}, { todoEntity: TodoEntity ->
viewModel.onTodoLongClick(todoEntity)
})
...
}

第二个获得片段中的onClickListener:

class MyFragment : Fragment() {
...
private fun setUpAdapter() = MyAdapter({ todoEntity, todoTitle ->
onClickListener(todoEntity, todoTitle)
}, { todoEntity: TodoEntity ->
onTodoLongClick(todoEntity)
})
fun onClickListener(todoEntity: TodoEntity, todoTitle: TextView) {
// Do Something
}
fun onTodoLongClick(todoEntity: TodoEntity) {
// Do Something
}
...
}

哪一个更好?

对于recyclerview的项,您应该创建一个回调。

在片段中,您为recyvrerview初始化适配器,还初始化回调并将其传递给适配器。

如果您正在为适配器的项使用数据绑定,则可以绑定此回调。

当出现事件(点击或长点击(时,回调到fragment,fragment会调用viewmodel进行处理。

最好检查一下我的例子:

https://github.com/frank-nhatvm/stackoverflowapp/blob/master/app/src/main/java/com/frank/stackoverflowapp/pages/question/listquestions/adapters/QuestionsAdapter.kt

在视图中,片段。ViewModel不应该从View中获得任何知识,因此常见的做法是:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val button = view.findViewById<Button>(R.id.button)
button.setOnClickListener { viewModel.doStuff() }
}

侦听器是在视图中设置的,但实际的代码位于视图模型中。片段应该尽可能小,并且只将布局及其生命周期与ViewModel中的行为联系起来。

最新更新