我正在尝试实现recyclerview
的item click event
。
在Java
中,使用了在adapter
中创建用于单击项目的interface
,在activity
中实现它,并将anonymous object
传递给adapter
的典型方法。
但是,Kotlin
接受lambda expressions
,并且可以将它们作为arguments
传递。
所以我不一定需要使用interface
,是吗?
或者是否有充分的理由尽可能多地使用interfaces
?
您可以使用高阶函数来实现这一点,而无需使用接口。
这里有一个例子:
片段/活动
recycler_view_photos.adapter = PhotosAdapter {
actionAfterClickOnItem()
}
private fun actionAfterClickOnItem() {
//stuff
}
适配器
class PhotosAdapter(val onItemClicked: () -> Unit) {
//stuff
inner class PhotoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(photo: Photo) {
//stuff
itemView.setOnClickListener {
onItemClicked.invoke()
}
}
}
}
接口可以很好地在组件之间创建契约、为类指定类型和创建事件,但使用您提到的Kotlin,您可以使用lambdas并用更少的代码行完成同样的操作。
界面最适合recyclerView中的点击监听器就像你有视图一样,每个视图中有三个按钮,如删除、删除和添加按钮,所以只需在界面中创建三个方法
fun onDeleteClick(position,Item) //Here item of that model which is passed in adapter
fun onAddClick(position,Item)
fun onRemoveClick(position,Item)
用您的活动实现这个接口,并将其传递到适配器中,然后在适配器中创建类似的点击侦听器
Holder.itemBinding.delete.setOnClickListener{ clickListener.OnDeleteClick(position, Item) }
因此,与其为每个按钮传递lambda函数,不如在活动中使用所有点击和覆盖的接口