本文同步自 博主的私人博客wing的地方酒馆

在前面的博客中,有一个栗子,是点击按钮转跳的监听器。

 button.setOnClickListener {
val user = User("name")
user.id = "100"
SecondActivity.startActivity(this,user)
}

可以看到,不用再new一个OnClickListener了。实际上这种写法是lambda的一种简略模式,通常情况下匿名内部类可以以如下表现形式展示:

button.setOnClickListener {
view-> toast(view.id.toString())
}

简单来说就是->左边为参数,右面为结果。其过程相当于


button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
toast(view.id.toString())
}
})

从以上栗子可以看出,lambda可以极大简化我们的代码。当左面参数没有使用到的时候,可以省略掉整个左半部分”view->”,就如同第一个代码片一样。

给RecyclerView加监听

在MainActivity里添加一个RecyclerView。并且新建一个适配器起名MainAdapter


import kotlinx.android.synthetic.main.item_main.view.* class MainAdapter: RecyclerView.Adapter<MainAdapter.ViewHolder>() {
override fun onBindViewHolder(holder: ViewHolder?, position: Int) { //改变作用域,with{}都是属于itemView
with(holder?.itemView!!){
tv_content.text = "第 $position 条数据"
}
} override fun getItemCount(): Int {
return 5
} override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
return ViewHolder(View.inflate(parent?.context, R.layout.item_main,null))
} class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) { }
}

像往常一样写一个RecyclerView的布局

注意这个适配器里使用的一些小技巧


1.with改变作用域,如果你有一大堆需要重复写的前缀,则可以使用with改变作用域。如:

mBinding?.tvName?.text = "张三"
mBinding?.tvContent?.text = "张三跟李四有py交易"
mBinding?.ivIcon.resouce = R.drawable.icon

可以改为

with(mBinding){
tvName?.text = "张三"
tvContent?.text = "张三跟李四有py交易"
ivIcon.resouce = R.drawable.icon
}

2.在头部导入

import kotlinx.android.synthetic.main.item_main.view.*

这样就可以免去万恶的findviewbyid


3.View.infalte()代替LayoutInfalter.form().infalte()

这个没啥好说的,省点代码而已~~


4.String模板输出,类似于C语言的print

添加监听器

大家都知道,有个简便的方法就是直接给itemView添加个OnClickListener()~

所以在onBindViewHolder()开刀,注意写法,这里与java有不同

class MainAdapter : RecyclerView.Adapter<MainAdapter.ViewHolder>() {
var mListener: ((pos: Int) -> Unit)? = null fun setOnItemClickListener(listener: ((pos: Int) -> Unit)){
mListener = listener
}
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
with(holder?.itemView!!) {
tv_content.text = "第 $position 条数据"
setOnClickListener { mListener?.invoke(position) }
}
}

其中给了一个函数变量mListener, 他的输入为int,返回值为Unit(kotlin的null,不过是个具体的对象)

var mListener: ((pos: Int) -> Unit)? = null

接下来给个set函数

fun setOnItemClickListener(listener: ((pos: Int) -> Unit)){
mListener = listener
}

这样就完成了item监听器的编写,所以我们的Activity代码如下:

    val adapter = MainAdapter()
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)
adapter.setOnItemClickListener { pos->toast("$pos") }

本文这就结束了(嫌文字太短?不要急啦,先去动手实践下咯。。系列文章,既然挖了坑,就不会拖更的(吧..))

如果你是Android开发者,那么你还可以来 wing的酒馆:425983695来分享你的开发经验哦

一个使用Kotlin开发的完整项目地址

让你的代码减少三倍!使用kotlin开发Android(五) 监听器的更多相关文章

  1. 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数

    本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...

  2. 让你的代码量减少3倍!使用kotlin开发Android(一)

    让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...

  3. 用Kotlin开发Android应用(II):创建新项目

    这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...

  4. 用Kotlin开发Android应用(I):介绍

    关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...

  5. 使用Kotlin开发Android应用(I):简单介绍

    使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...

  6. 使用Kotlin开发Android应用 - 环境搭建 (1)

    一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...

  7. 使用Kotlin开发Android应用(II):创建新工程

    在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...

  8. 使用Kotlin开发Android

    查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client源代码下载[请点击] 摘要 我首先声明我并没有使用Kotlin非常长时间,我差点儿是在学习的同一时候写 ...

  9. 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密

    上一篇我们介绍了缩短五倍的java bean,不知道你在看的时候有没有一种疑问捏? 本文同步自博主的私人博客wing的地方酒馆 再来回顾一下,两种代码的对比 public class User { p ...

随机推荐

  1. pymysql.err.ProgrammingError: 1064 (Python字符串转义问题)

    代码: sql = """INSERT INTO video_info(video_id, title) VALUES("%s","%s&q ...

  2. MySQL中的查询子句

    查询语句 字句名称 使用目的 select 确定结果集中应该包含那些列 from 指明所要提取数据的表,以及这些表是如何连接的 where 过滤不需要的数据 group by 用于对具有想用列值的行进 ...

  3. 更换yum源

    1. 首先备份 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2. 使用阿里云的 ...

  4. [LeetCode] Non-negative Integers without Consecutive Ones 非负整数不包括连续的1

    Given a positive integer n, find the number of non-negative integers less than or equal to n, whose ...

  5. 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目

    迁移Net项目为Net Core\Standard项目 背景: 我们公司内部有自己ORM开发框架,最新因为需要将系统迁移到国产服务器上,所以首先需要将最基础的ORM框架改造可以运行在国产服务器上.对于 ...

  6. Discuz 5.x 6.x 7.x 前台SQL注入漏洞

    来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-071516.html 漏洞出现在/include/editpost.inc.php. if($ ...

  7. [Luogu 3919]【模板】可持久化数组(可持久化线段树/平衡树)

    Description 如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生 ...

  8. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

  9. [模版]平衡树splay2

    题目描述 1. 加入:一个新的成员加入同好会,我会分配给他一个没有使用的id,并且询问他的兴趣值val. 2. 修改:id在区间[a,b]内的成员,兴趣值同时改变k,k有可能是负数,表示他们失去了对同 ...

  10. HDU 4501

    超市里有n件他想要的商品.小明顺便对这n件商品打了分,表示商品的实际价值.小明发现身上带了v1的人民币,会员卡里面有v2的积分,而且他能免费拿k件.他想知道他最多能买多大价值的商品. 由于小明想要的商 ...