// 老规矩 先写用法 // 注: 必须使用 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}