// 老规矩 先写用法
// 注: 必须使用 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 = pAdapter
import androidx.recyclerview.widget.RecyclerView
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import android.view.ViewGroup
import androidx.databinding.ViewDataBinding
import androidx.databinding.DataBindingUtil
import android.view.LayoutInflater
import android.view.View
import java.util.ArrayList
open class PAdapterKt : RecyclerView.Adapter<ListHolder> {
private var layoutId: Int
var bindViewInterface: (binding: ViewDataBinding, position: Int) -> Unit = { b, p -> }
//获取从Activity中传递过来每个item的数据集合
private var mDatas: MutableList<out Any> = ArrayList<Any>()
//HeaderView, FooterView
private var mHeaderView: View? = null
private var mFooterView: View? = null
constructor(mData: MutableList<out Any>, 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<out Any>,
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<ViewDataBinding>(
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
}
共享我的封装的 kotlin recycleview adapter (用法更简单)
于 2022-05-09 09:31:41 首次发布