在Kotlin编写RecyclerView适配器(KAD 16)

时间: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)
这样我们就已经有一个类和它的构造函数、不可变属性、以及一些有用的函数实现,如:equals 或 hashCode。
适配器
适配器的结构如下,它自创建一些必须的方法:
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)的更多相关文章
- Kotlin入门(22)适配器的简单优化
列表视图 为实现各种排列组合类的视图(包括但不限于Spinner.ListView.GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器Arr ...
- Kotlin编写Processing程序(使用函数式编程思维和面向接口方式)
写一例Kotlin编写的Processing程序,充分调用函数式编程思维和面向接口的编程思维,供自己和读者参考学习. 初衷 想要实现一行行的文字排版功能,每一行作为一个单位,可制定显示的位置.大小.文 ...
- Kotlin入门(23)适配器的进阶表达
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象.随着 ...
- 谁说接口不能有代码?—— Kotlin接口简介(KAD 26)
作者:Antonio Leiva 时间:Jun 6, 2017 原文链接:https://antonioleiva.com/interfaces-kotlin/ 与Java相比,Kotlin接口允许你 ...
- [Android实例] 推荐给你们一个好用的ListView、RecyclerView适配器
https://github.com/vihuela/RecyclerViewHelpper 如果用过RecyclerView的人都知道,高度不会包裹,然后写法好像也不是很简洁,甚至点击事件不好设 置 ...
- Android Studio(Kotlin)之RecyclerView
RecyclerView应该是ListView的增强版. RecyclerView与ListView的区别(我认为的): RecyclerView的性能比ListView高 RecyclerView支 ...
- android源码、博文2
每周精选 第 54 期 精品源码 仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件##示例 https://github.com/we ...
- Android学习——利用RecyclerView编写聊天界面
1.待会儿会用到RecyclerView,首先在app/build.gradle(注意有两个build.gradle,选择app下的那个)当中添加依赖库,如下: dependencies { comp ...
- 打造android偷懒神器———RecyclerView的万能适配器
转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时 ...
随机推荐
- genil层
genil 层将底层的业务逻辑封装成一个接口(例如 get_dynamic_result这种),供ui层调用(ui点击 search dynamic result按钮,会调用 get_dynamic_ ...
- TDD: 测试静态方法
对于静态方法,mock框架大多不支持测试.所以需要修改代码,以便调用的静态方法可测试. 1 一个静态方法类: public class MyHelper{ public static string ...
- 百度webAPI配合微信JSDK获取用户当前位子
逻辑: ①通过微信JS-SDK 获取地理位置接口 获取经纬度 ②调用百度地图转换经纬度的API,得到百度地图的经纬度 ③调用百度地图 正/逆地址编码服务-->国际化逆地理编码 得到JSON数据, ...
- JavaScript编写棋盘覆盖
一.前言 之前做了一个算法作业,叫做棋盘覆盖,本来需要用c语言来编写的,但是因为我的c语言是半桶水(哈哈),所以索性就把网上的c语言写法改成JavaScript写法,并且把它的覆盖效果显示出来 二.关 ...
- SpringBoot非官方教程 | 第七篇:springboot开启声明式事务
转载请标明出处: http://blog.csdn.net/forezp/article/details/70833629 本文出自方志朋的博客 springboot开启事务很简单,只需要一个注解@T ...
- Linux服务器SMB服务挂载目录
挂载方法 mount -o username=账号,password=密码 //SMB服务器IP/共享目录 /挂载点 smbclient链接 smbclient //SMB服务器IP/共享目录/ -U ...
- oracle快速添加用户及授权
--Oracle使用的是用户管理模式--意味着,Oracle的数据使用用户来分割 --以后开发,我们需要每个项目都需要使用一个用户 --所以:一个数据文件是可以放多个用户的数据的.但是我们开发从数据的 ...
- 关于truthy 和 falsy
一,强制类型转换 JavaScript 在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion )将值转换为布尔值,比如:在条件语句或者循环语句中 一,truthy 在java ...
- Java程序如何生成Jar 执行文件(2)
一.用Eclipse生产Jar文件 注意:此方法可以打包含有第三方jar包的项目 1. 首先,右键你的Java工程,选择Export,在Java文件夹下选择Runnable JAR file,如下图所 ...
- Golang定时器断续器
定时器 1.定时器结构 结构定义 type Timer struct { C <-chan Time // 接受定时器事件的通道 r runtimeTimer } type runtimeTim ...