QuickAdapter是什么东西呢,顾名思义就是快速构建RecyclerViewAdapter。
那此组件有什么特点:
快速构建Adapter,集成QuickViewHolder,快速绑定数据,配置itemView,margin,padding灵活,设置OnItemClickListener、OnItemLongLister,并且可单独设置ItemView内的View点击事件OnClickListener,扩展灵活,代码兼容
接下来我们看一下正常写法:
class Adapter2 : RecyclerView.Adapter<Adapter2.ViewHolder>() {
private val dataList = mutableListOf<String>()
private var onClickListener: ((position: Int, holder: ViewHolder) -> Unit?)? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.dialog_test, null))
}
override fun getItemCount(): Int = dataList.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.titleTv.text = dataList[position]
/*设置点击事件*/
holder.itemView.setOnClickListener {
if (onClickListener != null) onClickListener?.invoke(position, holder)
}
}
fun setOnItemClickListener(onClickListener: (position: Int, holder: ViewHolder) -> Unit?) {
this.onClickListener = onClickListener
}
inner class ViewHolder : RecyclerView.ViewHolder {
lateinit var titleTv: TextView
lateinit var userNameTv: TextView
lateinit var ageTv: TextView
lateinit var contentTv: TextView
lateinit var coverIv: ImageView
...
constructor(itemView: View) : super(itemView) {
titleTv = itemView.findViewById(R.id.titleTv)
userNameTv
ageTv
contentTv
coverIv
...
}
}
}
简单的列表,标准写法大概就如此了。
接下来看下QuickAdapter的写法,你会大吃一惊的
class Adapter : QuickAdapter<Int, QuickViewHolder>() {
override fun onBindData(holder: QuickViewHolder, position: Int, itemData: Int,viewType: Int) {
holder.setImgCircle(R.id.iv, itemData)
}
override fun onResultLayoutResId(viewType: Int): Int = R.layout.item_rv_list
}
只需要重写必要的两个方法即可,如此就完成了一个Adapter,代码量非常少,省力省心省时。
接下来我们假设几种使用场景
如果列表是CardView,那就需要设置margin来配合了。
override fun onResultItemMargin(): Float {
return super.onResultItemMargin()
}
只需要重写这一个方法就可以了设置上下左右的margin。像这样子的
如果有需求要求显示多纵列,他们之前还要有间隔,这时候就需要单独设置margin了,否则显示效果就是全挤在一起
override fun onResultItemMarginLeft(position: Int): Float {
return super.onResultItemMarginLeft(position)
}
override fun onResultItemMarginRight(position: Int): Float {
return super.onResultItemMarginRight(position)
}
override fun onResultItemMarginTop(position: Int): Float {
return super.onResultItemMarginTop(position)
}
override fun onResultItemMarginBottom(position: Int): Float {
return super.onResultItemMarginBottom(position)
}
像这样子的
都到这儿了,不妨我们再扩展一下,列表里面将展示多种Layout,那这应当如何处理呢?直接上代码
class Adapter : QuickAdapter<Int, QuickViewHolder>() {
override fun onBindData(holder: QuickViewHolder, position: Int, itemData: Int, viewType: Int) {
when (viewType) {
1 -> {//绑定书的数据
}
2 -> {//绑定作者的数据
}
}
}
override fun getItemViewType(position: Int): Int = when (getItem(position)) {
123 -> {//展示书
1
}
456 -> {//展示作者
2
}
else -> 1
}
override fun onResultLayoutResId(viewType: Int): Int = when (viewType) {
1 -> {//绑定书的Layout
R.layout.app_toast
}
2 -> {//绑定作者的Layout
R.layout.dialog_test
}
else -> {//绑定书的Layout
R.layout.app_toast
}
}
}
我们通过重写getItemViewType获取model中的数据,判断当前Layout的类型,然后在onResultLayoutResId中返回对应的Layout,最后根据在onBindData中根据类型绑定数据即可。一共三步完成了这种复杂的使用场景
接下来是自定义,改造成自己喜欢的样子
只需要继承QuickAdapter重写OnResultViewHolder基本就可以了
abstract class BaseAdapter<M> : QuickAdapter<M, BaseViewHolder>() {
override fun onResultViewHolder(itemView: View): BaseViewHolder = BaseViewHolder(itemView)
}
如此使用时就可以少传一个泛型,并且将ViewHolder替换为了自己自定义的
如何设置监听?直接上代码
1、设置整个item的点击事件
//设置整个item的点击事件
adapter.setOnItemClickListener { view, viewHolder, position, itemData ->
}
2、 设置整个item的长按事件
//设置整个item的长按事件
adapter.setOnItemLongClickListener { view, viewHolder, position, itemData ->
true
}
3、设置item内的View点击事件
//设置item内的View点击事件
adapter.setOnClickListener({ view, viewHolder, position, itemData ->
}, R.id.checkBox1, R.id.checkBox2, R.id.checkBox3)
4、设置item内的View选择事件
//设置item内的View选择事件
adapter.setOnCheckedChangedListener({ view, viewHolder, isChecked, position, itemData ->
}, R.id.btn1, R.id.btn2, R.id.btn3)
如果设置数据呢?
1、初始化数据
adapter.setDataList(dataList)
2、添加单个数据
adapter.add(item)
3、添加数据列表
adapter.addDataList(dataList)
4、移除数据
adapter.remove(1)
adapter.removeAll()
简单使用是不是非常简洁方便,而复杂使用也是比较灵活的。代码量省了许多,省心。
end---------
推荐使用gradle接入
implementation 'org.quick.android:quick-component:latest.release'
好了,到这里就结束,好东西那当然要分享了,马上告诉小伙伴我发现了一个很酷的东西吧。
QuickAndroid系列全家桶