做者:Antonio Leivaandroid
时间:Mar 14, 2017ide
原文连接:https://antonioleiva.com/recyclerview-adapter-kotlin/函数
经过建立RecyclerView适配器,Kotlin能够简化您的生活,这是一个有趣的方法。工具
在这个方法中,您能够看到更易阅读的代码组织,且避免冗余代码。学习
咱们建立一个适配器时,要设置标题和将图形插入进各单元内。ui
咱们不容许项目的更改,这就是个很是简单的适配器。若是咱们要更新数据,就须要建立新的适配器,并将数据设置到RecyclerView
中。this
咱们也用一个很是简单的模型,它仅须要一个标识符、标题和图形的URL。url
咱们将用一个数据类,您还记得咱们在前几篇文章见过:spa
1 data class Item(val id: Long, val title: String, val url: String)
这样咱们就已经有一个类和它的构造函数、不可变属性、以及一些有用的函数实现,如:equals
或 hashCode
。
3d
适配器的结构以下,它自建立一些必须的方法:
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
由模型分配值到它们相应的视图:
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应用程序,我建议您去获取免费指南,它教您怎样创建您的第一个项目,或者获取这本书,它教您怎样从头开始建立一个完整的应用程序。