认识一个事物的最好的方式,首先是去了解它的历史。
Kotlin这个语言从一开始推出到如今,已经有六年了。官方正式发布首个稳定版本的时间相对比较晚,这是一门比较新的语言。其大致发展简史如下:
2011年7月,JetBrains推出Kotlin项目。
2012年2月,JetBrains以Apache 2许可证开源此项目。
2016年2月15日,Kotlin v1.0(第一个官方稳定版本)发布。
2017 Google I/O 大会,Kotlin正式被Google定为Android开发一级语言。
笔者进入程序猿大军较晚,目前还只在Android行业匍匐前行,最近才刚刚接触Kotlin语言,因此Kotlin系列文章只为学习笔记,仅供参考。
Kotlin学习网站:
1、菜鸟教程:https://www.runoob.com/kotlin/kotlin-basic-syntax.html
2、Kotlin 语言中文站:https://www.kotlincn.net/docs/tutorials/android-plugin.html
3、Kotlin 中文文档:http://www.kotlindoc.cn/chapter/easy_kotlin_chapter_1.html
操作系统:Windows10
开发工具:Android studio3.2
RecyclerView简单使用:
一、导入依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'
二、Adapter
方法一:
1、使用Java编写Adapter代码
2、双击Shift,输入Convert Java File to Kotlin File,AS会自动将Java代码转成Kotlin代码
方法二:
既然是学习,怎可投机取巧,还是得自己撸一个,实践是检验真理的唯一标准!!!没办法,开撸!
1,新建RvAdapter类,注意是Kotlin Class,并继承RecyclerView.Adapter
class RvAdpter(var list: MutableList<String>, var context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>()
注意:
a、: ——>继承
b、(var list: MutableList<String>, var context: Context) ——> 主构造方法
并实现一下三个方法:
onCreateViewHolder
getItemCount
onBindViewHolder
都很简单,就不做过多解释。
2、新建内部类ViewHolder并继承RecyclerView.ViewHolder
class Holder(itemView: View) : RecyclerView.ViewHolder(itemView)
3、完善onCreateViewHolder方法
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): RecyclerView.ViewHolder {
val itemView = LayoutInflater.from(context).inflate(R.layout.layout_rv_test, p0, false)
val holder = Holder(itemView)
return holder
}
和Java大同小异,没什么难点,不过需要注意一点
val holder = Holder(itemView)
Kotlin中是没有new关键字的,切记,切记,切记!
4、完善onBindViewHolder方法
override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
viewHolder.itemView.tv_title.text = list[position]
viewHolder.itemView.tag = position
when (position % 2) {
0 -> viewHolder.itemView.setBackgroundColor(context.resources.getColor(R.color.colorAccent))
else -> viewHolder.itemView.setBackgroundColor(context.resources.getColor(R.color.colorPrimaryDark))
}
}
代码看上去是不是简洁了不少,哈哈
viewHolder.itemView.tv_title.text = list[position]
Kotlin中View中的控件可以直接使用控件的id实现,省去之前大篇幅的findViewById,这一点,你会在Activity中体验到的,并且爱不释手。
给TextView赋值同时也只需要.text来实现。
when (position % 2) {
0 -> viewHolder.itemView.setBackgroundColor(context.resources.getColor(R.color.colorAccent))
else -> viewHolder.itemView.setBackgroundColor(context.resources.getColor(R.color.colorPrimaryDark))
}
这几行代码相当于Java中的switch,只不过把case后面的 : 换成了->,当然when的作用不止于此,更多用法还待去发掘。
相信大多数朋友还是发现了不同,在创建RvAdapter的时候,在构造方法中,写了一个奇怪的东西:
var list: MutableList<String>
list[position]
为什么这么写?为什么不用List?
其实很简单,在Kotlin中List没有add方法,而MutableList可以实现add方法,具体原因,笔者还在研究中。
5、完善getItemCount方法
override fun getItemCount(): Int {
return list.size
}
最后在Activity中调用即可:
adapter = RvAdpter(list, this)
rv_test.layoutManager = LinearLayoutManager(this)
rv_test.adapter = adapter
到这里,一个简单的RecyclerView基本已经实现,先来看下效果:
![13652146-b845389867fc8403.png](https://i-blog.csdnimg.cn/blog_migrate/e78a77550eaaeb2d9fef0980c508e1ff.webp?x-image-process=image/format,png)
好像少了点什么,对,就是点击事件,好吧,继续撸!
在RvAdapter中定义OnItemClickListener接口:
interface OnItemClickListener {
fun OnItemClick(view: View, position: Int)
}
接口写好了,接着和Java一样,定义全局变量,并实现set方法:
var onClick: OnItemClickListener? = null
fun setOnItemClick(onItemClickListener: OnItemClickListener) {
this.onClick = onItemClickListener
}
接着在onCreateViewHolder中实现点击事件:
itemView.setOnClickListener {
onClick!!.OnItemClick(itemView, itemView.tag as Int)
}
文中出现了两个特殊符号,笔者暂定为标识符,一个是?,一个是!!,其实还有一种是?:,这是因为Kotlin中实现了NULL检查机制,什么意思?
NULL检查机制
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理。
//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt() ?: -1
就是说在声明一个可为空的变量的时候,必须在类型后加 ? 标识符,就像在RvAdapter中声明的点击事件一样:
var onClick: OnItemClickListener? = null
而在使用的时候就必须进行空判断处理,一种是直接抛出异常,另一种进行空判断处理。
以本文为例,简单粗暴一点:
onClick!!.OnItemClick(itemView, itemView.tag as Int)
直接抛异常去吧,至于为什么?笔者技术有限,暂时还不清楚怎么实现 ?: 方法,如果你有好的方法,请告知我。
源码:https://github.com/qylfzy/Kotlin_RecyclerView
联系方式:
个人博客:https://www.qylfzy.top/
QQ:945942463
邮箱:945942463@qq.com