让你的代码减少三倍!使用kotlin开发Android(五) 监听器
本文同步自 博主的私人博客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开发Android(五) 监听器的更多相关文章
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...
- 让你的代码量减少3倍!使用kotlin开发Android(一)
让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...
- 用Kotlin开发Android应用(II):创建新项目
这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...
- 用Kotlin开发Android应用(I):介绍
关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...
- 使用Kotlin开发Android应用(I):简单介绍
使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...
- 使用Kotlin开发Android应用 - 环境搭建 (1)
一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...
- 使用Kotlin开发Android应用(II):创建新工程
在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...
- 使用Kotlin开发Android
查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client源代码下载[请点击] 摘要 我首先声明我并没有使用Kotlin非常长时间,我差点儿是在学习的同一时候写 ...
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
上一篇我们介绍了缩短五倍的java bean,不知道你在看的时候有没有一种疑问捏? 本文同步自博主的私人博客wing的地方酒馆 再来回顾一下,两种代码的对比 public class User { p ...
随机推荐
- redis从入门到
下载 首先我们要到GitHub(https://github.com/MicrosoftArchive/redis/releases)上下载Source code (tar.gz) 上传到Linux上 ...
- jacascript JSON对象的学习
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! JSON (javascript object notation) 全称是 javascript 对象表示 ...
- 基于Mysql 5.7 GTID 搭建双主Keepalived 高可用
实验环境 CentOS 6.9 MySQL 5.7.18 Keepalived v1.2.13 拓扑图 10.180.2.161 M1 10.180.2.162 M2 10.180.2.200 VIP ...
- CentOS安装node.js-8.11.1+替换淘宝NPM镜像
注:以下所有操作均在CentOS 6.8 x86_64位系统下完成. #准备工作# 由于node.js-8.11.1在源码编译安装的时候需要gcc 4.9.4或clang++ 3.4.2以上版本的支持 ...
- 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)
本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公司你选,两厢便利. 毕 ...
- [HNOI2012]集合选数
题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中. 同学们不喜 ...
- [HNOI2016]大数
题目描述 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个询问求 S 的 ...
- ●POJ 2983 Is the Information Reliable?
题链: http://poj.org/problem?id=2983 题解: 差分约束. 1).对于条件(P u v w),不难发现反映到图上就是: $dis[u]-dis[v]=w$,所以添加两条边 ...
- C++traits——STL源码剖析
有时候我们希望知道迭代器所指的元素类型. 以迭代器所指声明对象: template<typename Iterator, typename T> void func_impl(Iterat ...
- 51 nod 1456 小K的技术(强连通 + 并查集)
1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...