【问题标题】:How to manage click events in RecyclerView following ViewModel approach?如何按照 ViewModel 方法管理 RecyclerView 中的点击事件?
【发布时间】:2021-06-03 14:15:18
【问题描述】:

你能帮帮我吗? 我一直在试图弄清楚,当使用基于 ViewModel 的设计时,在 RecyclerViews 中管理点击事件的最佳方法是什么?

现在我只是将 ViewModel 传递给 Adapter,然后再传递给 ViewHolder,可以吗? (可能是内存泄漏,可能是不好的做法)

我还有其他 2 个选项,带有接口的老式回调方式或只是将 LiveData 传递给 ViewHolder(LiveData 将被 Fragment 观察到)

【问题讨论】:

    标签: android android-recyclerview onclick android-livedata android-viewmodel


    【解决方案1】:

    我从 CodeLabs 中看到了一个非常好的方法。

    在 ListAdapter 类之外,您可以创建 OnClickListener 类,该类采用带有实体 Class 作为参数的 lambda。

    //OnclickListener class outside the Adapter class but on the same file with the adapter
    
    class OnClickListener(val clickListener: (asteroid: Asteroid) -> Unit) {
        fun onClick(asteroid: Asteroid) = clickListener(asteroid)
    }
    

    Asteroid Class是实体,这里有实体类可以切换。

    在 Listener 类中定义设置为 lambda 参数的 onClick 函数。

    然后将创建的监听器类传递给 ListAdapter 类构造器

    class AsteroidListAdapter(private val clickListener: OnClickListener) : ListAdapter<Asteroid, AsteroidListAdapter.ViewHolder>(
            DiffClass()) {
    

    如下覆盖onBindViewHolder()

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val asteroid = getItem(position)
    
            //view.setOnClickListener
            holder.itemView.setOnClickListener {
    
                clickListener.onClick(asteroid)
            }
            holder.bind(asteroid)
        }
    

    在 Fragment 的 onCreateView 中,您需要设置 RecyclerView 的 Adapter。

    代码显示在这张图片上

    这里我们设置 RecyclerView 的适配器,并将 Listener 传递给 Adapter 的构造函数。

    您将看到您可以访问单击的实体,并且可以导航到详细信息屏幕等。

    我知道这有点棘手,但你可以see step by step of this here

    【讨论】:

    • 我会对您的解决方案进行两处更改:1)不要将 OnClickListener 声明为这样的类,只需将其设为接口即可; 2)与其在onBindViewHolder上调用holder.itemView.setOnClickListener { ... },不如调用...setOnClickListener(this),让你的adapter实现View.OnClickListener并实现它的onClick方法;这样你就不会在每次调用 onBindViewHolder 时创建一个匿名对象。除此之外,这是在 RecyclerView 中处理点击的好方法。
    • 非常感谢您的回答,但我有疑问,那么 ViewModel 不应该处理视图事件吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多