作者: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应用程序,我建议您去获取免费指南,它教您怎样建立您的第一个项目,或者获取这本书,它教您怎样从头开始创建一个完整的应用程序。

最新文章

  1. deiban8 sourcelist
  2. 【翻译】设计模式学习系列1---【Design Patterns Simplified: Part 1【设计模式简述:第一部分】】
  3. C语言PIC32 serial bootloader和C#语言bootloader PC端串口通信程序
  4. 【转】Python yield 使用浅析
  5. Request、Servlet及其子接口
  6. Codeforces Round #298 (Div. 2) B. Covered Path
  7. Windows Phone开发工具初体验【转载】
  8. UTF-8/UTF-16/UTF-32
  9. JVM里面hashtable和hashmap实现原理
  10. 在asp.net中如何自己编写highcharts图表导出到自己的服务器上来
  11. poj 2253 Frogger【最小生成树变形】【kruskal】
  12. RSA算法记录----摘抄
  13. 《LED调光-DMX512灯光协义接收控制》转
  14. wampserver2.5局域网IP访问配置
  15. /usr/bin/ld: warning: libavformat.so.57, needed by /home/camera.so, not found (try using -rpath or -rpath-link)
  16. 远程连接mysql8.0,Error No.2058 Plugin caching_sha2_password could not be loaded
  17. java8-函数编程
  18. Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)
  19. golang中数组与切片的区别
  20. react native的注释

热门文章

  1. [转]这13个开源GIS软件,你了解几个?
  2. 第13章 GPIO输入—按键检测
  3. Redux学习笔记-----基础部分
  4. 1486: [HNOI2009]最小圈
  5. android SearchView和ListView简单使用
  6. 如何用 npm 同时执行两条监听命令
  7. android发布帖子类技术
  8. python应用:主题分类(gensim lda)
  9. Django的aggregate()和annotate()函数的区别
  10. PAT-A1002