android - 为什么处理点击的功能需要从适配器初始化传递?
问题描述
这是一个有助于理解的问题。我有一个 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 中?
感谢您的阅读,我希望它是有意义的。很高兴澄清任何观点。
解决方案
您可以将函数放在您想要的位置,但应该可以通过“Adapter.onBindViewHolder()”方法访问它。
如果您将“onClick()” lambda 放在适配器类内部,那么将很难与该适配器外部的东西进行交互(如果需要)。事实上,由于更好的性能和更少的内存消耗,将扩展适配器类(您的“MetarItemAdapter”)标记为 STATIC 是一种常见的做法。如果类是静态的,您将不会在适配器之外“触摸”任何内容,因为 UserInterface 通常在一个对象(活动、片段等)中实例化,但如果您将函数作为参数传递,则可以从到处。
推荐阅读
- arrays - 如何在Delphi中检查动态记录的数组长度?
- vue.js - VueJS 路由器阻止返回某些路由器链接
- c# - 从转换为文本格式的 PDF 中提取美元价格和以逗号作为千位分隔符的数字
- ironpython - Spotfire:如何在 Ironpython 脚本中使用计算值(动态项)?
- git - Notify only one Repository in a multiple SCM setup
- gmail-api - 从电子邮件设置 API 迁移到 GMail API 时更新权限范围
- shell - 搜索模式并在 shell 脚本中替换它
- android - 在 mapbox 上添加动态标记不适用于 SymbolLayer
- r - 从数据表中提取值
- wpf - 如何设置数据网格中垂直设置的列标题的高度(宽度)?