作者:Antonio Leiva

时间:Mar 14, 2017

原文链接:https://antonioleiva.com/recyclerview-adapter-kotlin/

通过创建RecyclerView适配器,Kotlin可以简化您的生活,这是一个有趣的方法。

在这个方法中,您可以看到更易阅读的代码组织,且避免冗余代码。

Kotlin的RecyclerView适配器

我们创建一个适配器时,要设置标题和将图形插入进各单元内。

我们不允许项目的更改,这就是个非常简单的适配器。如果我们要更新数据,就需要创建新的适配器,并将数据设置到RecyclerView中。

模型

我们也用一个非常简单的模型,它仅需要一个标识符、标题和图形的URL。

我们将用一个数据类,您还记得我们在前几篇文章见过

 data class Item(val id: Long, val title: String, val url: String)

这样我们就已经有一个类和它的构造函数、不可变属性、以及一些有用的函数实现,如:equalshashCode

适配器

适配器的结构如下,它自创建一些必须的方法:

 class MyAdapter : RecyclerView.Adapter() {

     override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
} override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
} override fun getItemCount(): Int {
} class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
}

您将看见我已经创建了一个由原始ViewHolder扩展而来的ViewHolder类。

这是因为适配器需要原始抽象类的实现。

另外,有些元素被标注为nullable。这是因为如果库没有适当的@Nullable@NonNull标注,Kotlin就没有方法知道null是否允许,这就要让我们来决定了。

如果我们通过默认方式自创建方法了,它就会认为其值是nullable

但是,进一步研究支持库,我们就知道哪些值是为null,所以我们能够删除它。

 class MyAdapter : RecyclerView.Adapter() {

     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
} override fun onBindViewHolder(holder: ViewHolder, position: Int) {
} override fun getItemCount(): Int {
} class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
}

构造函数

适配器需要接收参数项目和侦听器。这就像这样:

class MyAdapter(val items: List, val listener: (Item) -> Unit)

方法的实现非常容易。我用在前一篇创建的扩展函数方法膨胀视图:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(parent.inflate(R.layout.view_item))

override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(items[position], listener)

override fun getItemCount() = items.size

有三个方法可以实现由简约的形式,获得以前的结果。用三行我们就实现了完整的适配器。

现在就去实现ViewHolder

ViewHolder

ViewHolder由模型分配值到它们相应的视图:

 class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(item: Item, listener: (Item) -> Unit) = with(itemView) {
itemTitle.text = item.title
itemImage.loadUrl(item.url)
setOnClickListener { listener(item) }
}
}

这里的每件事都已经在其他文章中读到:with函数、ImageView的loadUrl扩展函数用Kotlin Android扩展访问视图,和点击侦听器的映射

适配器赋值

现在仅剩一件事:将适配器赋值到视图:

 recycler.layoutManager = GridLayoutManager(this, 2)
recycler.adapter = MyAdapter(items) {
toast("${it.title} Clicked")
}

最后一个函数是侦听器,它接收一项。当您点击这项时,代码就简单地将标题打印到该项上。

结论

在Kotlin中实现RecyclerView就这么简单。

到目前为止,我们使用一些学过的工具,已将代码简化到最低程度。

如果您要学习更多的所有这些,以娴熟方法创建您自己的Android应用程序,我建议您去获取免费指南,它教您怎样建立您的第一个项目,或者获取这本书,它教您怎样从头开始创建一个完整的应用程序。

在Kotlin编写RecyclerView适配器(KAD 16)的更多相关文章

  1. Kotlin入门(22)适配器的简单优化

    列表视图 为实现各种排列组合类的视图(包括但不限于Spinner.ListView.GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器Arr ...

  2. Kotlin编写Processing程序(使用函数式编程思维和面向接口方式)

    写一例Kotlin编写的Processing程序,充分调用函数式编程思维和面向接口的编程思维,供自己和读者参考学习. 初衷 想要实现一行行的文字排版功能,每一行作为一个单位,可制定显示的位置.大小.文 ...

  3. Kotlin入门(23)适配器的进阶表达

    前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象.随着 ...

  4. 谁说接口不能有代码?—— Kotlin接口简介(KAD 26)

    作者:Antonio Leiva 时间:Jun 6, 2017 原文链接:https://antonioleiva.com/interfaces-kotlin/ 与Java相比,Kotlin接口允许你 ...

  5. [Android实例] 推荐给你们一个好用的ListView、RecyclerView适配器

    https://github.com/vihuela/RecyclerViewHelpper 如果用过RecyclerView的人都知道,高度不会包裹,然后写法好像也不是很简洁,甚至点击事件不好设 置 ...

  6. Android Studio(Kotlin)之RecyclerView

    RecyclerView应该是ListView的增强版. RecyclerView与ListView的区别(我认为的): RecyclerView的性能比ListView高 RecyclerView支 ...

  7. android源码、博文2

      每周精选 第 54 期   精品源码 仿网易新闻app下拉标签选择菜单     仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件##示例 https://github.com/we ...

  8. Android学习——利用RecyclerView编写聊天界面

    1.待会儿会用到RecyclerView,首先在app/build.gradle(注意有两个build.gradle,选择app下的那个)当中添加依赖库,如下: dependencies { comp ...

  9. 打造android偷懒神器———RecyclerView的万能适配器

    转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时 ...

随机推荐

  1. 【转】Mac本地生成SSH Key 的方法

    1. 查看秘钥是否存在 打开终端查看是否已经存在SSH密钥:cd ~/.ssh 如果没有密钥则不会有此文件夹,有则备份删除,   也可以直接删除, 2.生成新的秘钥, 命令如下 $ssh-keygen ...

  2. 三角测量(Triangulation)

    三角测量(Triangulation)是视觉定位中,已知多个相机位置和空间中一点的投影点,进一步求该点3D位置的方法.三角测量是Pose Estimation的相反过程,求出相机位置后,图像中其它特征 ...

  3. andorid 网络通信最简单demo

    要和后台进行通信 一开始发现接不到数据 后来发生了线程错误 在网上查到:在一些高版本中,与网络通信的操作因为要花费比较大的时间,所以应该放在单独的线程中去做. 但为什么一些网上demo没有放在单独的线 ...

  4. RPC的应用(The lowest layer of RPC)

    server端代码: #include <stdio.h>#include <rpc/rpc.h>#include <rpcsvc/rusers.h> void n ...

  5. #leetcode刷题之路9- 回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1:输入: 121输出: true 示例 2:输入: -121输出: false解释: 从左向右读, 为 ...

  6. Linux 服务器之间文件传输

    linux的scp命令: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们需要获得远程服务器上 ...

  7. 快速玩转linux(3)

    Linux常用命令 软件操作命令 执行操作 命令 软件包管理器 yum 安装软件 yum install xxx 卸载软件 yum remove xxx 搜索软件 yum search xxx 清除缓 ...

  8. python核心编程2 第十五章 练习

    15-1.识别下列字符串 :“bat ”.“bit ”.“but ”.“hat ”.“hit” 或 “hut ” import re from random import choice strtupl ...

  9. 路由器基础配置之dhcp配置

    我们将以上面的拓扑图为例,router9为dhcp的服务器,为pc4,5,6分配三个不同网段的地址,pool为要分配的三个地址池,我们要把pc4设置为12网段,pc5设置成34网段,pc6设置成56网 ...

  10. 03 shell编程之case语句与函数

    本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...