Kotlin 打造一個RecyclerView的通用Adapter(一)

晴天大帥逼發表於2019-04-26

前言

最近用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中使用,寫的有問題的地方,還請大佬指點一下

相關文章