当前位置: 首页 > news >正文

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

作者:Antonio Leiva

时间:Mar 14, 2017

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

 

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

 

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

 

Kotlin的RecyclerView适配器

 

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

 

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

 

模型

 

 

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

 

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

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

 

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

 

适配器

 

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

 1 class MyAdapter : RecyclerView.Adapter() {
 2      
 3     override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
 4     }
 5  
 6     override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
 7     }
 8  
 9     override fun getItemCount(): Int {
10     }
11  
12     class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
13 }

 

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

 

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

 

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

 

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

 

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

 1 class MyAdapter : RecyclerView.Adapter() {
 2     
 3     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
 4     }
 5  
 6     override fun onBindViewHolder(holder: ViewHolder, position: Int) {
 7     }
 8  
 9     override fun getItemCount(): Int {
10     }
11  
12     class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
13 }

 

构造函数

 

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

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由模型分配值到它们相应的视图:

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

 

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

 

适配器赋值

 

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

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

 

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

 

结论

 

Kotlin中实现RecyclerView就这么简单。

 

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

 

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

 

转载于:https://www.cnblogs.com/figozhg/p/6576034.html

相关文章:

  • web-app 与本地app的区别
  • JS 面向对象例题
  • Idea中的插件-列出Java Bean的所有set方法
  • JavaScript的数据类型与变量
  • Android 权限的实现
  • 看《神探夏洛克》经典台词
  • 挂载硬盘,并分区格式化
  • JavaScript中的对象
  • 用vs2015 编译 web app ionic
  • HTTP访问控制(CORS)
  • 02_SimpleTrigger
  • gbdt调参的小结
  • BZOJ 2055: 80人环游世界 [上下界费用流]
  • 给object数组进行排序(排序条件是每个元素对象的属性个数)
  • spring(一) IOC讲解
  • 《剑指offer》分解让复杂问题更简单
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Fabric架构演变之路
  • HTML中设置input等文本框为不可操作
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Javascript Math对象和Date对象常用方法详解
  • jQuery(一)
  • JS学习笔记——闭包
  • mysql innodb 索引使用指南
  • nodejs实现webservice问题总结
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python_OOP
  • Redux系列x:源码分析
  • 阿里云应用高可用服务公测发布
  • 记一次和乔布斯合作最难忘的经历
  • 每天10道Java面试题,跟我走,offer有!
  • 普通函数和构造函数的区别
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 设计模式 开闭原则
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 优化 Vue 项目编译文件大小
  • 正则表达式小结
  • ​用户画像从0到100的构建思路
  • #162 (Div. 2)
  • #微信小程序:微信小程序常见的配置传旨
  • $.each()与$(selector).each()
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)Android开发优化---------UI优化
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)c52学习之旅-点亮LED灯
  • (转)可以带来幸福的一本书
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .axf 转化 .bin文件 的方法
  • .net 7 上传文件踩坑
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net面试题4