Android 如何在MVVM结构中的RecyclerView项上设置OnClickListener

Android 如何在MVVM结构中的RecyclerView项上设置OnClickListener,android,android-recyclerview,onclicklistener,android-mvvm,Android,Android Recyclerview,Onclicklistener,Android Mvvm,我有一个应用程序是在MVVM中构建的。我在同一个活动中有不同的片段。每个片段都有自己的ViewModel,所有数据都从RESTAPI检索 在FragmentA中,有一个列出X类实例的RecyclerView。我想在RecyclerView上设置OnClickListener,并想在RecyclerView中单击某个项目时将相关的X对象传递给FragmentB。我怎样才能做到这一点呢?我的设想如下 片段将侦听器对象传递给适配器,适配器又将其传递给视图持有者 下面是它应该是什么样子的速写 class

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


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

我的设想如下

片段将侦听器对象传递给适配器,适配器又将其传递给视图持有者

下面是它应该是什么样子的速写

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])
        }
    }
}
这里有一些文章可以帮助你了解事情的大意。 但是他们不会直接回答你的问题

希望对你有帮助

如果使用数据绑定,则需要通过适配器类将视图(在本例中为片段)传递到布局中,并且需要在布局文件中导入视图,以便能够调用视图的方法

android:onClick="@{() -> view.onXXXClick(item)}"
将当前的模型类(即
item
)传递到此新方法中,然后在视图中创建onXXXClick方法,并执行任何您想要的操作

如果您要执行视图相关操作,例如从一个片段导航到另一个片段或启动服务,则应在视图中创建上述功能,如果您要执行网络或数据库相关操作,则应在
视图模型


您可以查看我的,以便更好地理解。

提供您迄今为止尝试过的代码。仅提供基本项目的信息,这可能更切题,而不是共享10个文件,这会导致读者失去兴趣和时间。不过我可以链接到该项目。使用java接口,请参阅“如何将数据从一个片段传递到另一个片段”的链接。它与MVVM体系结构无关。Viewmodel用于保存数据集。如果您在活动中使用了viewmodel,那么您可以跳过接口部分。我可以包装ListAdapter并从FragmentA发送回调作为参数。此回调可以使用navController()并将所选项目发送到FragmentB。我会试试。解决这个问题最方便的方法是在适配器类中使用接口。这是我在我的一本书中也用到的;)我认为应该在视图类上处理单击,因此使用数据绑定传递视图似乎是一种方法。谢谢。@Mehmed正如我在回答中所说的,Ui交互应该在视图类中处理,所以我同意你的意见,如果我需要使用数据绑定和mvvm@ZaferCelalogluthen您需要获得特定视图的位置,然后在适配器上应用click listener