首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android Kotlin中,将onclick事件传递给viewholder的正确方法是什么?

在Android Kotlin中,将onclick事件传递给viewholder的正确方法是什么?
EN

Stack Overflow用户
提问于 2021-01-10 19:30:04
回答 2查看 221关注 0票数 0

这两种方式有什么区别吗?我一直在使用第二种方法,到目前为止,它是有效的,但我在阅读教程文章时发现了第一种方法。

第一个:

代码语言:javascript
复制
class FlowersAdapter(private val onClick: (Flower) -> Unit) :
ListAdapter<Flower, FlowersAdapter.FlowerViewHolder>(FlowerDiffCallback) {

/* ViewHolder for Flower, takes in the inflated view and the onClick behavior. */
class FlowerViewHolder(itemView: View, val onClick: (Flower) -> Unit) :
    RecyclerView.ViewHolder(itemView) {
    private val flowerTextView: TextView = itemView.findViewById(R.id.flower_text)
    private val flowerImageView: ImageView = itemView.findViewById(R.id.flower_image)
    private var currentFlower: Flower? = null

    init {
        itemView.setOnClickListener {
            currentFlower?.let {
                onClick(it)
            }
        }
    }

    /* Bind flower name and image. */
    fun bind(flower: Flower) {
        currentFlower = flower

        flowerTextView.text = flower.name
        if (flower.image != null) {
            flowerImageView.setImageResource(flower.image)
        } else {
            flowerImageView.setImageResource(R.drawable.rose)
        }
    }
}

}

First way of writing

第二个:

代码语言:javascript
复制
class FlowerViewHolder(itemView: View) :
    RecyclerView.ViewHolder(itemView) {
    private val flowerTextView: TextView = itemView.findViewById(R.id.flower_text)
    private val flowerImageView: ImageView = itemView.findViewById(R.id.flower_image)
    private var currentFlower: Flower? = null

    /* Bind flower name and image. */
    fun bind(flower: Flower) {
        currentFlower = flower

        flowerTextView.text = flower.name
        if (flower.image != null) {
            flowerImageView.setImageResource(flower.image)
        } else {
            flowerImageView.setImageResource(R.drawable.rose)
        }

        itemView.setOnClickListener {
                onClick(flower)
        }
    }
}

Second way of writing

请花时间和精力告诉我其中的不同之处。

EN

回答 2

Stack Overflow用户

发布于 2021-01-10 20:16:14

从关注点分离的角度来看,所有的clickListeners都应该在ActivityFragment中处理,而Adapters只是为了包装项目,在你的例子中是Flower,并以一种可以被RecyclerView用来在屏幕上显示的方式呈现它们。

话虽如此,clickListeners的核心逻辑将从bind方法移到活动/片段中,而这正是firstMethod的全部内容。事实上,我没有注意到使用FirstMethod比使用第二种方法有任何性能改进,但我坚持使用FirstOne,因为它更多的是代码组织。

票数 1
EN

Stack Overflow用户

发布于 2021-01-10 20:11:07

我觉得适配器应该对单击侦听器一无所知,也不应该知道有关ViewHolder的任何细节;所以我不会通过适配器传递回调。

我喜欢将回调传递给ViewHolder,但不是映射到init块中,而是在适配器的onBind钩子上执行,在那里我将视图作为参数接收。另外,我将ViewHolder直接传递或更新到我的Adapter中,然后使用一些通用函数来计算数据集是否发生了变化。

如果你这样做,你的好处是,你可以构建一个通用适配器,并在其他地方使用它,而不必真正考虑以后可能需要实现多少不同类型的ViewHolder,因为它是完全不可知的。

TLDR;

因此,根据您为我们提供的内容,我将使用这两种方法的优点。将回调绑定到bind挂钩并通过ViewHolder的构造函数传递回调

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65652780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档