为啥处理点击的功能需要从适配器初始化传递?

Posted

技术标签:

【中文标题】为啥处理点击的功能需要从适配器初始化传递?【英文标题】:Why does function to handle click need to be passed through from Adapter initialisation?为什么处理点击的功能需要从适配器初始化传递? 【发布时间】:2021-06-15 17:46:25 【问题描述】:

这是一个有助于理解的问题。我有一个 recyclerview,经过大量努力,我终于能够处理单击 recyclerview 中的项目。这很困难,因为我看不到它背后的逻辑如何。以下是一些代码片段:

在 MainActivity 中,初始化适配器:

// Adapter takes a lambda function as a parameter - this will go through to what happens onClick
        val adapter = MetarItemAdapter
            a: String -> u.l(this, a)
        

在适配器类中,使用所需的 lambda 函数初始化类,现在命名为 onClick:

class MetarItemAdapter(
        private val onClick: (String) -> Unit
) : RecyclerView.Adapter<MetarItemAdapter.MetarViewHolder>() 

...rest of adapter code

在 onBindViewHolder 中,这是我使用 onClick 的方式:

    override fun onBindViewHolder(holder: MetarViewHolder, position: Int) 
        val currentItem = metarList[position]
        holder.tvMetar.text = currentItem.metar
        holder.tvMetar.setOnClickListener 
            onClick(holder.tvMetar.text.toString())
        
    

在查看了很多堆栈溢出问题后,我认为这是在回收站视图中处理点击的方法。

我的问题是为什么我们必须在主活动中定义一个函数,因为它需要初始化类,它可以在整个类中使用,因为它只是用于 onBindViewHolder 中的简单点击处理?为什么处理点击的代码不仅仅包含在 onBindViewHolder 中?

感谢您的阅读,我希望它有意义。很高兴澄清任何观点。

【问题讨论】:

【参考方案1】:

你可以把函数放在你想要的地方,但它应该可以通过“Adapter.onBindViewHolder()”方法访问。

如果您将“onClick()”lambda 放在适配器类内部,那么将很难与此适配器外部的东西进行交互(如果需要)。事实上,由于更好的性能和更少的内存消耗,将扩展适配器类(您的“MetarItemAdapter”)标记为 STATIC 是一种常见的做法。如果类是静态的,您将不会在适配器之外“触摸”任何内容,因为 UserInterface 通常在一个对象(活动、片段等)中实例化,但如果您将函数作为参数传递,则可以从无处不在。

【讨论】:

以上是关于为啥处理点击的功能需要从适配器初始化传递?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MouseAdapter 是适配器?

无法将数据从RecyclerView适配器传递到Viewpager适配器

当意图传递给其他活动时,为啥从 parcelable 中得到错误的值?

在 RecyclerView 适配器中初始化 viewHolder 时出错

为啥 C++ 分配器中没有重新分配功能?

如何将值从基本适配器传递到 Android 中的 Activity