【Kotlin】RecyclerView使用(一)

认识一个事物的最好的方式,首先是去了解它的历史。

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
device-2018-09-26-134146.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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小二者也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值