让你的代码减少三倍!使用kotlin开发Android(五) 监听器
来源:互联网 发布:mac os 支持ntfs 编辑:程序博客网 时间:2024/05/16 05:05
本文同步自 博主的私人博客wing的地方酒馆
在前面的博客中,有一个栗子,是点击按钮转跳的监听器。
button.setOnClickListener { val user = User("name") user.id = "100" SecondActivity.startActivity(this,user) }
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
可以看到,不用再new一个OnClickListener了。实际上这种写法是lambda的一种简略模式,通常情况下匿名内部类可以以如下表现形式展示:
button.setOnClickListener { view-> toast(view.id.toString()) }
- 1
- 2
- 3
- 1
- 2
- 3
简单来说就是->左边为参数,右面为结果。其过程相当于
button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view){ toast(view.id.toString()) }})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
从以上栗子可以看出,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) { }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
像往常一样写一个RecyclerView的布局
注意这个适配器里使用的一些小技巧
1.with改变作用域,如果你有一大堆需要重复写的前缀,则可以使用with改变作用域。如:
mBinding?.tvName?.text = "张三"mBinding?.tvContent?.text = "张三跟李四有py交易"mBinding?.ivIcon.resouce = R.drawable.icon
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
可以改为
with(mBinding){ tvName?.text = "张三" tvContent?.text = "张三跟李四有py交易" ivIcon.resouce = R.drawable.icon}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
2.在头部导入
import kotlinx.android.synthetic.main.item_main.view.*
- 1
- 1
这样就可以免去万恶的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) } } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
其中给了一个函数变量mListener, 他的输入为int,返回值为Unit(kotlin的null,不过是个具体的对象)
var mListener: ((pos: Int) -> Unit)? = null
- 1
- 1
接下来给个set函数
fun setOnItemClickListener(listener: ((pos: Int) -> Unit)){ mListener = listener }
- 1
- 2
- 3
- 1
- 2
- 3
这样就完成了item监听器的编写,所以我们的Activity代码如下:
val adapter = MainAdapter() recyclerView.adapter = adapter recyclerView.layoutManager = LinearLayoutManager(this) adapter.setOnItemClickListener { pos->toast("$pos") }
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
本文这就结束了(嫌文字太短?不要急啦,先去动手实践下咯。。系列文章,既然挖了坑,就不会拖更的(吧..))
如果你是Android开发者,那么你还可以来 wing的酒馆:425983695来分享你的开发经验哦
一个使用Kotlin开发的完整项目地址
- 让你的代码减少三倍!使用kotlin开发Android(五) 监听器
- 让你的代码减少三倍!使用kotlin开发Android(五) 监听器
- 让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程
- 让你的代码量减少3倍!使用kotlin开发Android(一)
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
- 让你的代码量减少3倍!使用kotlin开发Android(一)
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
- 让你的代码量减少3倍!使用kotlin开发Android(三) 缩短五倍的Java Bean
- 让你的代码量减少3倍!使用kotlin开发Android(三) 缩短五倍的Java Bean
- 让你的个人效率翻三倍
- 让你的个人效率翻三倍
- 让你的个人效率翻三倍
- 让你的个人效率翻三倍
- 让你的个人效率翻三倍
- 让你的个人效率翻三倍
- 让你的 Kotlin 代码远离 !!
- stm32中断的使用
- java.sql.DataTruncation: Data truncation异常
- 原生js实现ajax方法
- DirectX X文件格式转换
- 背包
- 让你的代码减少三倍!使用kotlin开发Android(五) 监听器
- AngularJS 过滤器 (详解)
- 欧几里德的游戏
- Nginx 配置项记录
- HDU 1049 Climbing Worm (简单贪心)
- catch和finally可以同时省略吗?
- 【笔记】shiro中的RememberMe设置:
- js验证字符串是否为数字或小数点
- Java正则表达式总结 --- 常用的Java正则表达式需求总结