更新一下,发现一种更简单的方式,如下,后面的内容就不用看了
fun setOnClickListener(lis: (view: View) -> Unit) { val view = View(context) view.setOnClickListener(lis) }
--------
用kotlin有一段时间了,发现每次调用系统函数大部分都可以直接传递一个lambda表达式过去,而自己的函数却只能传一个引用过去,表示很无奈
然后就研究了下怎么自定义个一个可以接受lambda表达式的函数
网上搜了几篇文章感觉都比较绕,也可能是我比较笨,嗯,好了,长话短说
首先
假设我们需要在用户点击某个view的时候,可以拿到这个view的index
正常情况下,我们都是如下写法
class Container { private var listener : ItemClickListener? = null fun setOnItemClickListener(listener : ItemClickListener) { this.listener = listener } } fun test() { val contaienr = Container() contaienr.setOnItemClickListener(object : ItemClickListener { override fun onItemClick(index : Int) { Log.e(TAG , "$index") } }) } interface ItemClickListener { fun onItemClick(index : Int) }
那么接下来就以一个简单易懂的例子教你写一个可以接受labmda表达式的函数
其他代码都没有变化,所以只展示有变化的部分
如下:
class Container { private var listener : ItemClickListener? = null fun setOnItemClickListener(action : (Int) -> Unit) { listener = object : ItemClickListener { override fun onItemClick(index : Int) { action(index) } } } } fun test() { val contaienr = Container() contaienr.setOnItemClickListener { Log.e(TAG , "$it") } }
上面的action就是你传进来的lambda表达式,他表示接收一个Int类型的参数,没有返回值
这样是不是写个又返回值的或者多个参数的都手到擒来,怎么样,学会了吗,是不是简单易懂