-
Notifications
You must be signed in to change notification settings - Fork 5.2k
BaseQuickAdapter
mumu edited this page Aug 7, 2023
·
12 revisions
v4与以往版本不同,BaseQuickAdapter
不在提供其他复杂功能(例如“加载更多”),目前仅包含“空布局”、数据操作、点击事件功能。
是作为一个基本的、简单的、单纯的基础类存在,定义更加明确,不再是大杂烩。
为了支持官方的ConcatAdapter使用,ViewHolder不得不提出来,由开发者自行实现,表面上看似乎是增加繁琐程度,但从长远来看,实际上提供了更高的灵活度
-
快速使用
class TestAdapter : BaseQuickAdapter<Status, TestAdapter.VH>() { // 自定义ViewHolder类 class VH( parent: ViewGroup, val binding: LayoutAnimationBinding = LayoutAnimationBinding.inflate( LayoutInflater.from(parent.context), parent, false ), ) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { // 返回一个 ViewHolder return VH(parent) } override fun onBindViewHolder(holder: VH, position: Int, item: Status?) { // 设置item数据 } }
-
如果你的Adapter特别简单,不想用
ViewBinding
,自己也不想写ViewHolder
,可以使用QuickViewHolder
:class TestAdapter : BaseQuickAdapter<Status, QuickViewHolder>() { override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): QuickViewHolder { // 返回一个 ViewHolder return QuickViewHolder(R.layout.layout_animation, parent) } override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: Status?) { // 设置item数据 holder.getView(R.id.xxxx) } }
-
item 点击事件
adapter.setOnItemClickListener { adapter, view, position -> Tips.show("onItemClick $position") }
-
item 长按事件
adapter.setOnItemLongClickListener { adapter, view, position -> Tips.show("onItemLongClick $position") true }
-
item 子控件点击事件
// 需要传递控件 id adapter.addOnItemChildClickListener(R.id.iv_num_add) { adapter, view, position -> Tips.show("onItemChildClick: add $position") }
-
item 子控件长按事件
// 需要传递控件 id adapter.addOnItemChildLongClickListener(R.id.btn_long) { adapter, view, position -> Tips.show("onItemChildLongClick $position") true }
-
去除点击抖动(双击)的点击方法。 默认500毫秒间隔,可以传递参数修改。
// item 去除点击抖动的扩展方法 adapter.setOnDebouncedItemClick { adapter, view, position -> }
// item Child 去除点击抖动的扩展方法 adapter.addOnDebouncedChildClick { adapter, view, position -> }
-
设置数据集合
adapter.submitList(list)
-
修改某一位置的数据
//修改index为1处的数据 adapter[1] = data
-
新增数据
// 尾部新增数据 adapter.add(data) // 在指定位置添加一条新数据 adapter.add(1, data) // 添加数据集 adapter.addAll(list) // 指定位置添加数据集 adapter.addAll(1, list)
-
删除数据
// 删除数据 adapter.remove(data) // 删除指定位置数据 adapter.removeAt(1)
-
交换数据位置(仅仅是这两个数据的位置交换)
// 交换两个位置的数据 adapter.swap(1, 3)
-
移动数据位置(注意和 swap 的区别)
// 交换两个位置的数据 adapter.move(1, 3)
-
获取Item数据的索引
// 如果返回 -1,表示不存在 adapter.itemIndexOfFirst(data)
-
根据索引,获取Item数据
// 如果返回 null,表示没有数据 adapter.getItem(1)
-
内部内置了5种默认动画:
/** * BaseQuickAdapter.AnimationType.AlphaIn * BaseQuickAdapter.AnimationType.ScaleIn * BaseQuickAdapter.AnimationType.SlideInBottom * BaseQuickAdapter.AnimationType.SlideInLeft * BaseQuickAdapter.AnimationType.SlideInRight */ adapter.setItemAnimation(BaseQuickAdapter.AnimationType.AlphaIn)
-
自定义动画 需继承
ItemAnimator
实现自定义动画class CustomAnimation1 : ItemAnimator { override fun animator(view: View): Animator { // 创建三个动画 val alpha: Animator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f) val scaleY: Animator = ObjectAnimator.ofFloat(view, "scaleY", 1.3f, 1f) val scaleX: Animator = ObjectAnimator.ofFloat(view, "scaleX", 1.3f, 1f) scaleY.interpolator = DecelerateInterpolator() scaleX.interpolator = DecelerateInterpolator() // 多个动画组合,可以使用 AnimatorSet 包装 val animatorSet = AnimatorSet() animatorSet.duration = 350 animatorSet.play(alpha).with(scaleX).with(scaleY) return animatorSet } } // 设置动画 adapter.itemAnimation = CustomAnimation1()
-
重写动画执行操作
class TestAdapter : BaseQuickAdapter<Status, QuickViewHolder>() { ... override fun startItemAnimator(anim: Animator, holder: RecyclerView.ViewHolder) { } }
-
是否打开动画
adapter.animationEnable = true
空视图只会在无数据的情况下显示
- 是否使用空布局(默认 false)
adapter.isEmptyViewEnable = false
- 使用
Layout Id
adapter.setEmptyViewLayout(context, R.layout.loading_view)
- 使用
View
mAdapter.emptyView = view
- 注意
⚠️ :如果你使用GridLayoutManager
,请切换至QuickGridLayoutManager
,否则空布局无法铺满
-
自定义返回
itemViewType
class TestAdapter : BaseQuickAdapter<Status, QuickViewHolder>() { ... override fun getItemViewType(position: Int, list: List<Status>): Int { // 返回自定义的 itemViewType return 1 } }
-
重写
List
数据集class TestAdapter : BaseQuickAdapter<Status, QuickViewHolder>() { ... override var items: List<Status> get() { return emptyList() // 你的操作 } set(value) { // 你的操作 } }
-
监听 ViewHolder 附加到窗口的状态
// 监听 ViewHolder 附加到窗口的状态 adapter.addOnViewAttachStateChangeListener(object :BaseQuickAdapter.OnViewAttachStateChangeListener{ override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder) { } override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) { } })