最近用kotlin寫代碼,感受很舒服,重構一個以前的項目,在寫adapter的時候,發現相比用java寫,能夠不用在ViewHolder裏面定義一堆控件變量,再findViewById一些列操做。在這以前我也搜了一下,kotlin裏面寫RecyclerView的adapter,發現不少人都是在viewHolder裏面又findId,定義一堆控件,至關於把java寫的代碼拷貝到kotlin裏面自動生成。少了一點簡潔的感受。 對比之前各個adapter,其實只有兩個位置寫法不同,onBindViewHolder和MyViewHolderjava
在用kotlin以後就剩下一個地方不同了,因而我考慮直接寫一個通用的adapter,省得每次有列表的時候都要新建一個adapter,這樣太過繁瑣,我又是個比較懶得人,因而說幹就幹。先貼代碼bash
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
}
}
}
複製代碼
爲了調用方便,我採用了比較流行的鏈式建立,使用方法很簡單以下:ide
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中使用,寫的有問題的地方,還請大佬指點一下佈局