【问题标题】:Be OnClickListener and OnLongClickListener in ViewModel or Fragment? [closed]是 ViewModel 还是 Fragment 中的 OnClickListener 和 OnLongClickListener? [关闭]
【发布时间】:2021-04-27 15:24:12
【问题描述】:

在 ViewModel 或 Fragment 中为 recyclerView 项目设置 onClickListener 和 onLongClickListener?为什么?

第一个从 viewModel 获取 onClickListener:

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

第二个在Fragment中获取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
 }

...
}

哪个更好?

【问题讨论】:

  • 您的问题缺少关键词,无法解析。
  • 我认为现在更好。
  • 很遗憾没有; “更好”的问题是基于意见的,因此是题外话。我想到的词是第一句中的“去”或“成为”,并不是说它对这里的问题有那么大的帮助。
  • 啊哈,谢谢。明白了。

标签: android onclicklistener android-viewmodel onlongclicklistener


【解决方案1】:

对于recyclerview的item,你应该创建一个回调。

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

如果你对适配器项使用数据绑定,你可以绑定这个回调。

当有事件(点击或长按)时,回调到fragment,fragment会调用viewmodel来处理。

最好看看我的例子:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • for recyclerView items
    • 我确实忽略了这个标准。选择@NhatVM 他的答案,正确回答问题
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2011-06-05
    相关资源
    最近更新 更多