为什么处理点击的功能需要从适配器初始化传递?
Why does function to handle click need to be passed through from Adapter initialisation?
这是一个帮助理解的问题。我有一个 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)
}
在适配器 class 中,class 使用所需的 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())
}
}
在查看了很多堆栈溢出问题后,我认为这是在 recyclerview 中处理点击的方法。
我的问题是 为什么 我们必须在 main activity 中一直定义一个函数,因为它需要初始化 class ,因为它在整个 class 期间都可用,因为它只是用于在 onBindViewHolder 中进行简单的点击处理?为什么处理点击的代码不能只包含在 onBindViewHolder 中?
感谢您的阅读,我希望它是有意义的。很高兴澄清任何一点。
您可以将函数放在您想要的位置,但它应该可以通过“Adapter.onBindViewHolder()”方法访问。
如果您将“onClick()”lambda 放在适配器内部Class,那么将很难与此适配器外部的东西进行交互(如果需要)。事实上,由于更好的性能和更少的内存消耗,将扩展适配器 Class(您的“MetarItemAdapter”)标记为 STATIC 是常见的做法。如果 Class 是静态的,您将不会“接触”适配器之外的任何内容,因为 UserInterface 通常在一个对象(Activity、片段等)中实例化,但是如果您传递函数作为一个论点,它可以从任何地方创建。
这是一个帮助理解的问题。我有一个 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)
}
在适配器 class 中,class 使用所需的 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())
}
}
在查看了很多堆栈溢出问题后,我认为这是在 recyclerview 中处理点击的方法。
我的问题是 为什么 我们必须在 main activity 中一直定义一个函数,因为它需要初始化 class ,因为它在整个 class 期间都可用,因为它只是用于在 onBindViewHolder 中进行简单的点击处理?为什么处理点击的代码不能只包含在 onBindViewHolder 中?
感谢您的阅读,我希望它是有意义的。很高兴澄清任何一点。
您可以将函数放在您想要的位置,但它应该可以通过“Adapter.onBindViewHolder()”方法访问。
如果您将“onClick()”lambda 放在适配器内部Class,那么将很难与此适配器外部的东西进行交互(如果需要)。事实上,由于更好的性能和更少的内存消耗,将扩展适配器 Class(您的“MetarItemAdapter”)标记为 STATIC 是常见的做法。如果 Class 是静态的,您将不会“接触”适配器之外的任何内容,因为 UserInterface 通常在一个对象(Activity、片段等)中实例化,但是如果您传递函数作为一个论点,它可以从任何地方创建。