这两种方式有什么区别吗?我一直在使用第二种方法,到目前为止,它是有效的,但我在阅读教程文章时发现了第一种方法。
第一个:
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)
}
}
}}
第二个:
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)
}
}
}请花时间和精力告诉我其中的不同之处。
发布于 2021-01-10 20:16:14
从关注点分离的角度来看,所有的clickListeners都应该在Activity或Fragment中处理,而Adapters只是为了包装项目,在你的例子中是Flower,并以一种可以被RecyclerView用来在屏幕上显示的方式呈现它们。
话虽如此,clickListeners的核心逻辑将从bind方法移到活动/片段中,而这正是firstMethod的全部内容。事实上,我没有注意到使用FirstMethod比使用第二种方法有任何性能改进,但我坚持使用FirstOne,因为它更多的是代码组织。
发布于 2021-01-10 20:11:07
我觉得适配器应该对单击侦听器一无所知,也不应该知道有关ViewHolder的任何细节;所以我不会通过适配器传递回调。
我喜欢将回调传递给ViewHolder,但不是映射到init块中,而是在适配器的onBind钩子上执行,在那里我将视图作为参数接收。另外,我将ViewHolder直接传递或更新到我的Adapter中,然后使用一些通用函数来计算数据集是否发生了变化。
如果你这样做,你的好处是,你可以构建一个通用适配器,并在其他地方使用它,而不必真正考虑以后可能需要实现多少不同类型的ViewHolder,因为它是完全不可知的。
TLDR;
因此,根据您为我们提供的内容,我将使用这两种方法的优点。将回调绑定到bind挂钩并通过ViewHolder的构造函数传递回调
https://stackoverflow.com/questions/65652780
复制相似问题