是否为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中的行为联系起来。