如何在MVVM结构中为RecyclerView项设置OnClickListener

6

我有一个按照MVVM结构组织的应用程序。在同一个活动中有不同的片段。每个片段都有自己的ViewModel,并且所有数据都从REST API中检索。

在FragmentA中,有一个RecyclerView列出X类实例。我想在RecyclerView上设置OnClickListener,并且当RecyclerView中的项目被点击时,我想将相关的X对象传递到FragmentB。我该如何实现这一点?


1
请提供您迄今为止尝试过的所有代码。 - Rajnish suryavanshi
我可以在FragmentA中包装ListAdapter并将回调作为参数发送。这个回调可以使用navController()并将选定的项目发送到FragmentB。我会尝试。 - Mehmed
2
最方便的解决方法是在适配器类中使用接口。这也是我在其中一个repos中使用的方式 ;) - Alex Mamo
是的,两个都可以翻译。 - Mehmed
好的,那我会发布我的答案以及我在MVVM架构中应用的GitHub存储库。 - Zafer Celaloglu
显示剩余5条评论
2个回答

6

我设想的是这样的。

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])
        }
    }
}

以下是一些文章,可以帮助您了解事物的基本概念。

虽然它们没有直接回答您的问题,但希望对您有所帮助。 链接1 链接2


4
如果您正在使用数据绑定,您需要通过适配器类将视图(在您的情况下为Fragment)传递到布局中,并且您需要在布局文件中导入您的视图才能调用视图的方法。
android:onClick="@{() -> view.onXXXClick(item)}"

将当前的模型类(item)传递到这个新方法中,然后在您的视图中创建onXXXClick方法并进行任何您想要的操作。

如果您要执行与视图相关的操作,例如从一个片段导航到另一个片段启动服务,则应该在您的视图中创建以上函数;如果您正在执行网络或数据库相关操作,则应该在您的ViewModel中创建。

您可以查看我的GitHub存储库以更好地理解。


我认为点击事件应该在View类中处理,因此使用数据绑定传递视图似乎是正确的方法。谢谢。 - Mehmed
@Mehmed,正如我在我的答案中所说的,UI交互应该在视图类中处理,所以我同意你的观点。 - Zafer Celaloglu
如果我需要在RecyclerView中使用DataBinding和MVVM为特定视图(按钮、ImageView等)设置OnClick事件,该怎么办?@ZaferCelaloglu - EL TEGANI MOHAMED HAMAD GABIR
然后,您需要获取特定视图的位置,然后在适配器上应用单击监听器。 - Zafer Celaloglu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接