前言
最近用kotlin写代码,感觉很舒服,重构一个之前的项目,在写adapter的时候,发现相比用java写,可以不用在ViewHolder里面定义一堆控件变量,再findViewById一些列操作。在这之前我也搜了一下,kotlin里面写RecyclerView的adapter,发现很多人都是在viewHolder里面又findId,定义一堆控件,相当于把java写的代码拷贝到kotlin里面自动生成。少了一点简洁的感觉。 对比以前各个adapter,其实只有两个位置写法不一样,onBindViewHolder和MyViewHolder
在用kotlin之后就剩下一个地方不一样了,于是我考虑直接写一个通用的adapter,免得每次有列表的时候都要新建一个adapter,这样太过繁琐,我又是个比较懒得人,于是说干就干。先贴代码
class CommentAdapter private constructor(): RecyclerView.Adapter<CommentAdapter.MyViewHolder>() {
private var mDatalist: List<*>? = null
private var mLayoutId:Int? = null
private var mBindView: BindView? = null
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): MyViewHolder {
val view = LayoutInflater.from(p0.context).inflate(mLayoutId!!,p0,false)
return MyViewHolder(view)
}
override fun getItemCount(): Int {
return mDatalist!!.size
}
override fun onBindViewHolder(p0: MyViewHolder, p1: Int) {
mBindView?.onBindView(p0, mDatalist?.get(p1)) //在onBindView方法里面实现绑定
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
/**
* 绑定接口
*/
interface BindView{
fun onBindView(viewHolder: MyViewHolder, data: Any?)
}
/**
* 建造者,用来完成adapter的数据组合
*/
class Builder{
private var commentAdapter: CommentAdapter = CommentAdapter()
fun setDatas(lists: List<*>): Builder {
commentAdapter.mDatalist = lists
return this
}
fun setLayoutId(layoutId:Int): Builder {
commentAdapter.mLayoutId = layoutId
return this
}
fun bindView(bindView: BindView): Builder {
commentAdapter.mBindView = bindView
return this
}
fun create(): CommentAdapter {
return commentAdapter
}
}
}
复制代码
为了调用方便,我采用了比较流行的链式创建,使用方法很简单如下:
recyclerRecommend.adapter = CommentAdapter.Builder()
.setDatas(videos.data)
.setLayoutId(R.layout.item_recommend)
.bindView(object : CommentAdapter.BindView{
override fun onBindView(viewHolder: CommentAdapter.MyViewHolder, data: Any?) {
val myData:Data = data as Data
viewHolder.itemView.text_comment.text = myData.name
}
})
.create()
复制代码
设置数据和布局id,再添加bindView方法,这个方法是用来绑定数据和控件的只需要viewHolder.itemView.控件名 就可以拿到该控件进行操作了,总体来说,想就相当于将bindView提取出来,在外部实现了。记录一下,只能在kotlin中使用,写的有问题的地方,还请大佬指点一下