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

How to set OnClickListener on RecyclerView item in MVVM structure

我有一个在 MVVM 中构建的应用程序。我在同一个 activity 中有不同的片段。每个 fragment 都有自己的 ViewModel 并且所有数据都是从 REST API.

中检索的

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

我怎么想的是下面的。

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 1 link 2

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

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

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

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

你可以查看我的 GitHub repository 以更好地理解。