博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kotlin 之 接口回调
阅读量:5776 次
发布时间:2019-06-18

本文共 2630 字,大约阅读时间需要 8 分钟。

hot3.png

    有如下常用情景,在某个Adapter我们设置自己的接口回调,将原来的java代码改写之后大概会是这个样子:

class SomeListAdapter(){    var mOnItemClickListener:OnItemClickListener? = null    fun setOnItemClickListener(onItemClickListener : OnItemClickListener){        mOnItemClickListener = onItemClickListener    }    override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {            mOnItemClickListener?.onItemClick(article)          }    companion object {       public interface OnItemClickListener{            fun onItemClick(article:DTArticle)        }    }}//override fun setAdapter(){        var adapter = SomeListAdapter(context)        adapter.setOnItemClickListener ( object: ArticleListAdapter.Companion.OnItemClickListener {                override fun onItemClick(article: DTArticle) {                    SomeDetailActivity.startInstance(context,article.mId)                }            }        )}

    即使你完全不知道kotlin,也很容易理解上面的代码,因为和java实在是太像了。

    但是对于kotlin而言,或许我们有更好更简单的方法

class SomeListAdapter(context: Context) : BaseListAdapter
(context) { lateinit var mOnItemClickListener: (DTArticle) -> Unit fun setOnItemClickListener(onItemClickListener: (DTArticle) -> Unit) { mOnItemClickListener = onItemClickListener } override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { if (mOnItemClickListener != null) { mOnItemClickListener(article) } } companion object { }}//override fun setAdapter(){ var adapter = SomeListAdapter(context) adapter.setOnItemClickListener{ SomeDetailActivity.startInstance(context,it.mId) }}

    看看我们做了什么?我们抛弃了接口的概念,而是引入了一个新的类型的变量:

                                      (DTArticle) -> Unit

    这是一个整体,不可分割,表示入参是DTArticle,返回值为空的一个方法参数,有点类似函数指针的样子嘛。

    注意,调用的地方也有所改变,我们需要意识到,这个参数本身就是一个方法。

    

    能不能继续简化?多谢一个setOnItemClickListener感觉在kotlin中是没必要的,所以,我们去掉它吧

class SomeListAdapter(context: Context) : BaseListAdapter
(context) { lateinit var mOnItemClickListener: (DTArticle) -> Unit override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { if (mOnItemClickListener != null) { mOnItemClickListener(article) } } companion object { }}//override fun setAdapter(){ var adapter = SomeListAdapter(context) adapter.mOnItemClickListener = { SomeDetailActivity.startInstance(context,it.mId) }}

    这样就看上去很简洁了,并且已经和java代码相去胜远了,但是实际上做的是同一件事情。

    对于多参数的接口类型,比如:

lateinit var listener:(pos:Int,a:String)->Unit

    会出现一个问题,it到底代指哪个参数?肯定会出现问题,所以对于这种情况,使用时这样的

listener = {pos, a -> Log.d("sss",a+pos) }

    我们需要显示的指定参数名!

转载于:https://my.oschina.net/zzxzzg/blog/1559745

你可能感兴趣的文章
花钱删不完负面消息
查看>>
JBPM之JPdl小叙
查看>>
(step6.1.5)hdu 1233(还是畅通工程——最小生成树)
查看>>
Membership三步曲之进阶篇 - 深入剖析Provider Model
查看>>
huffman编码——原理与实现
查看>>
Linux移植随笔:终于解决Tslib的问题了【转】
查看>>
MyBitis(iBitis)系列随笔之四:多表(多对一查询操作)
查看>>
【leetcode】Longest Common Prefix
查看>>
前端优化及相关要点总结
查看>>
Vue 列表渲染
查看>>
struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
查看>>
25 个精美的手机网站模板
查看>>
C#反射实例应用--------获取程序集信息和通过类名创建类实例
查看>>
VC中实现文字竖排的简单方法
查看>>
会话标识未更新
查看>>
【设计模式】数据访问对象模式
查看>>
Tomcat8 配置Oracle11g数据源
查看>>
【PHP面向对象(OOP)编程入门教程】8.构造方法__construct()与析构方法__destruct()
查看>>
ThinkPHP常用配置路径
查看>>
阿里架构师:程序员必须掌握的几项核心技术能力
查看>>