今天,是对RecycleView.Adapter进行封装,形成通用的Apapter;RecycleView概念和用途,以为为什么要用RecycleView而不用Listview,这些我就不重复了,一搜一大把,写的都比我好,理解的也比我深入,这里,我要实现的就是使用Kotlin实现通用Adapter;为什么要实现通用Adapter,无非是我们的项目中,会出现各式各样的List展示,于是乎,就出现了无数个Adapter,虽然ctrl+c和ctrl+v很容易完成,但是,毕竟多了那么多类,对ctrl键的伤害也大,而且我是懒人,希望能够一次书写,n次运行,于是便有了这个想法,今天刚好不算忙,就实现了下,下面让我们来看代码:
先看看之前的Adapter的代码:
MainAdapter
package com.vslimit.kotlindemo.adapter
/**
* Created by vslimit on 16/1/15.
*/
class MainAdapter(val items: List<String>, val itemClick: (String) -> Unit) :
RecyclerView.Adapter<MainAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = parent.ctx.layoutInflater.inflate(R.layout.item_list_main, parent, false)
return ViewHolder(view, itemClick)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bindForecast(items[position])
}
override fun getItemCount() = items.size
class ViewHolder(view: View, val itemClick: (String) -> Unit) : RecyclerView.ViewHolder(view) {
fun bindForecast(item: String) {
with(item) {
itemView.item_name.text = item
itemView.item_text.text = item
itemView.onClick { itemClick(item) }
}
}
}
}
我们仔细看看代码,发现,主要就是ViewHolder的实现,其他的代码大同小异,那么这时,想法来了,可不可以只写一个Adapter,多个ViewHolder呢,说写就写,就有了下面的代码:
BaseAdapter
package com.vslimit.kotlindemo.adapter
import android.support.v7.widget.RecyclerView
import android.view.ViewGroup
import com.vslimit.kotlindemo.extensions.ctx
import org.jetbrains.anko.layoutInflater
/**
* Created by vslimit on 16/1/15.
*/
class BaseAdapter<T, K : ViewHolder<T>>(val layoutResourceId: Int, val items: List<T>, val itemClick: (T) -> Unit) :
RecyclerView.Adapter<K>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): K {
val view = parent.ctx