> 文档中心 > 共享我的封装的 kotlin recycleview adapter

共享我的封装的 kotlin recycleview adapter

// 老规矩 先写用法 // 注: 必须使用 databinding/*b  binding  item 的   (父类) 需强转*p  position 位置*   mutableListOf("") 你的实际数据 后续发一个 支持多种布局的 adapter *///  var pAdapter =  PAdapterKt(mutableListOf(""), R.layout.item) { b, p ->  val ib = b as EmojiFragmentItemBinding //在这里 绑定数据 点击事件 等等     }//    mRecycler.layoutManager = LinearLayoutManager(this)//    mRecycler.adapter = pAdapterimport androidx.recyclerview.widget.RecyclerViewimport androidx.databinding.ViewDataBindingimport androidx.recyclerview.widget.RecyclerViewimport android.view.ViewGroupimport androidx.databinding.ViewDataBindingimport androidx.databinding.DataBindingUtilimport android.view.LayoutInflaterimport android.view.Viewimport java.util.ArrayListopen class PAdapterKt : RecyclerView.Adapter {    private var layoutId: Int    var bindViewInterface: (binding: ViewDataBinding, position: Int) -> Unit = { b, p -> }    //获取从Activity中传递过来每个item的数据集合    private var mDatas: MutableList = ArrayList()    //HeaderView, FooterView    private var mHeaderView: View? = null    private var mFooterView: View? = null    constructor(mData: MutableList, layoutId: Int) { mDatas = mData this.layoutId = layoutId    }    constructor(mData: Int, layoutId: Int) { for (i in 0 until mData) {     mDatas.add("" as Nothing) } this.layoutId = layoutId    }    constructor( mData: MutableList, layoutId: Int, bindViewInterface: (binding: ViewDataBinding, position: Int) -> Unit    ) { mDatas = mData this.layoutId = layoutId this.bindViewInterface = bindViewInterface    }    constructor(mData: Int, layoutId: Int,bindViewInterface: (binding: ViewDataBinding, position: Int) -> Unit) { for (i in 0 until mData) {     mDatas.add("" as Nothing) } this.layoutId = layoutId this.bindViewInterface = bindViewInterface    }    //HeaderView和FooterView的get和set函数    var headerView: View? get() = mHeaderView set(headerView) {     mHeaderView = headerView     notifyItemInserted(0) }    var footerView: View? get() = mFooterView set(footerView) {     mFooterView = footerView     notifyItemInserted(itemCount - 1) }    /     * 重写这个方法,很重要,是加入Header和Footer的关键,我们通过判断item的类型,从而绑定不同的view    *     */    override fun getItemViewType(position: Int): Int { if (mHeaderView == null && mFooterView == null) {     return TYPE_NORMAL } if (mHeaderView != null) {     if (position == 0) {  //第一个item应该加载Header  return TYPE_HEADER     } } if (mFooterView != null) {     if (position == itemCount - 1) {  //最后一个,应该加载Footer  return TYPE_FOOTER     } } return TYPE_NORMAL    }    //创建View,如果是HeaderView或者是FooterView,直接在Holder中返回    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListHolder { if (mHeaderView != null && viewType == TYPE_HEADER) {     val p = mHeaderView!!.parent as ViewGroup     p.removeView(mHeaderView)     return ListHolder(mHeaderView) } if (mFooterView != null && viewType == TYPE_FOOTER) {     return ListHolder(mFooterView) } val binding = DataBindingUtil.inflate(     LayoutInflater.from(parent.context),     layoutId,     parent,     false ) val listHolder = ListHolder(binding.root) listHolder.binding = binding return listHolder    }    //绑定View,这里是根据返回的这个position的类型,从而进行绑定的,   HeaderView和FooterView, 就不同绑定了    override fun onBindViewHolder(holder: ListHolder, position: Int) { if (getItemViewType(position) == TYPE_FOOTER) {     return } if (getItemViewType(0) != TYPE_HEADER) {     holder.binding?.let { bindViewInterface(it, position) } } else if (position != 0) {     holder.binding?.let { bindViewInterface(it, position - 1) } }    }    //返回View中Item的个数,这个时候,总的个数应该是ListView中Item的个数加上HeaderView和FooterView    override fun getItemCount(): Int { return if (mHeaderView == null && mFooterView == null) {     mDatas.size } else if (mHeaderView == null) {     mDatas.size + 1 } else if (mFooterView == null) {     mDatas.size + 1 } else {     mDatas.size + 2 }    }    companion object { const val TYPE_HEADER = 0 //说明是带有Header的 const val TYPE_FOOTER = 1 //说明是带有Footer的 const val TYPE_NORMAL = 2 //说明是不带有header和footer的    }}class ListHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!) {    var binding: ViewDataBinding? = null}