使用 kotlin 实现 recyclerview 的条目点击事件(lambda 表达式)
首先看一下类 Java 的实现方式
自定义接口从而实现点击事件的处理
// 定义一个接口,用接口的形式来处理点击事件
interface OnItemClickListener {
fun onItemClick(pos: Int)
}
// 自定义一个 Adapter 类
class ItemAdapter() {
var mOnItemClickListener: OnItemClickListener? = null
fun setOnItemClickListener(onItemClickListener: OnItemClickListener){
mOnItemClickListener = onItemClickListener
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
mOnItemClickListener?.onItemClick(position)
}
}
// 接着在 Activity 中使用
class ItemActivity() {
var adapter = SomeListAdapter(context)
adapter.setOnItemClickListener ( object: ArticleListAdapter.Companion.OnItemClickListener {
override fun onItemClick(pos: Int) {
// do something
}
})
}
然后使用 kotlin 的简单方法
kotlin 对于 item 的点击事件,抛弃了接口的概念,使用的是 lambda 表达式
class ItemAdapter() {
lateinit var onItemClick: (Int) -> Unit
fun setOnItemClickListener(onItemClick: (Int) -> Unit) {
this.onItemClick= onItemClick
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
itemView.setOnClickListener {
onItemClick.invoke(position)
}
}
}
class ItemActivity() {
var adapter = SomeListAdapter(context)
adapter.setOnItemClickListener {
// do something
}
}
当然,我们还可以继续简化
既然都简化了,那干脆直接使用变量来处理
另外,还可以加上处理两个或多个参数的情景
class ItemAdapter() {
lateinit var onItemClick: (v: View, pos: Int) -> Unit
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
itemView.setOnClickListener {
onItemClick.invoke(it, position)
}
}
}
class ItemActivity() {
var adapter = SomeListAdapter(context)
adapter.onItemClick = { v, pos ->
// do something
}
}