【问题标题】:How to set OnClickListener on RecyclerView item in MVVM structure如何在 MVVM 结构中的 RecyclerView 项目上设置 OnClickListener
【发布时间】:2019-08-21 07:53:37
【问题描述】:

我有一个以MVVM 构建的应用程序。我在同一个活动中有不同的片段。每个fragment 都有自己的ViewModel,所有数据都从一个REST API 中检索。

在 FragmentA 中,有一个 RecyclerView 列出了 X 类实例。我想在RecyclerView 上设置OnClickListener,并且当在RecyclerView 中单击项目时,我想将相关的X 对象传递给FragmentB。我怎样才能做到这一点?

【问题讨论】:

  • 提供您迄今为止尝试过的任何代码。
  • 只是提供信息的基本项目,这可能更重要,而不是共享 10 个文件,这会导致读者失去兴趣和时间。不过我可以链接到该项目。
  • 使用 java 接口,参见“如何将数据从一个片段传递到另一个片段”的链接。它与 MVVM 架构无关。 Viewmodel 用于保存数据集。如果您在活动中使用了视图模型,那么您可以跳过界面部分。
  • 我可以包装 ListAdapter 并从 FragmentA 发送回调作为参数。此回调可以使用 navController() 并将所选项目发送到 FragmentB。我会试试的。
  • 解决这个问题最方便的方法是在你的适配器类中使用一个接口。这也是我在我的repos 之一中使用的;)

标签: android android-recyclerview onclicklistener android-mvvm


【解决方案1】:

我怎么想象它如下。

Fragment 将侦听器对象传递给适配器,适配器又将其传递给 ViewHolders

这是它应该是什么样子的快速草图

class Fragment {
    val listener = object: CustomAdapter.CustomViewHolderListener() {
        override fun onCustomItemClicked(x: Object) {}

    }

    fun onViewCreated() {
        val adapter = CustomAdapter(listener)
    }
}
---------------
class CustomAdapter(private val listener: CustomViewHolderListener) {
    val listOfXObject = emptyList() // this is where you save your x objects

    interface CustomViewHolderListener{
        fun onCustomItemClicked(x : Object)
    }

    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
        holder.itemView.setOnClickListener {
            listener.onCustomItemClicked(listOfXObject[position])
        }
    }
}

这里有一些文章可以帮助您了解事情的一般要点。 他们不会直接回答你的问题

希望对你有帮助 link 1link 2

【讨论】:

    【解决方案2】:

    如果您使用数据绑定,则需要通过适配器类将视图(在您的情况下为 Fragment)传递到布局中,并且需要将视图导入布局文件中才能调用视图的方法

    android:onClick="@{() -> view.onXXXClick(item)}"
    

    将您当前的模型类 item 传递给这个新方法,然后在您的视图中创建 onXXXClick 方法并做任何您想做的事情。

    如果您将执行视图相关操作,例如 从一个片段导航到另一个片段启动服务,您应该在视图中创建上述函数,如果您是做网络或数据库相关的操作它应该在你的ViewModel

    您可以查看我的GitHub repository 以更好地了解。

    【讨论】:

    • 我认为应该在 View 类上处理点击,因此使用数据绑定传递视图似乎是这样做的方法。谢谢。
    • @Mehmed 正如我在回答中所说,UI 交互应该在视图类中处理,所以我同意你的观点
    • 如果我需要使用数据绑定和 mvvm@ZaferCelaloglu 为 recyclerview 中的特定视图(按钮、图像视图...等)设置 onclick 怎么办
    • 那么您需要获取特定视图的位置,然后在您的适配器上应用点击监听器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多