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

前言

最近用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中使用,写的有问题的地方,还请大佬指点一下布局

相关文章
相关标签/搜索