zoukankan      html  css  js  c++  java
  • 在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应用程序,我建议您去获取免费指南,它教您怎样建立您的第一个项目,或者获取本书,它教您怎样从头开始创建一个完整的应用程序。

  • 相关阅读:
    Android Studio cannot launch avd in emulator问题解决
    ios设备安装破解软件及自己下载的软件ipa教程
    解决数据库连接错误 您在wp-config.php文件中提供的数据库用户名和密码可能不正确,或者无法连接到localhost上的数据库服务器,这意味着您的主机数据库服务器已停止工作。
    地图工具类大集合
    在家云看景点的皮蛋TV
    在线本地视频翻译
    南瓜影视特权
    韩剧tv特权来了
    网盘下载合集,宽带多快,我多快
    白嫖永久免费电脑端美图秀秀
  • 原文地址:https://www.cnblogs.com/figozhg/p/6576034.html
Copyright © 2011-2022 走看看