在 UI 设计稿有列表的情况下,通常优选 RecyclerView 组件,那么配套使用的就是 RecyclerView.Adapter。第三方库 BaseRecyclerViewAdapterHelper 提供了很好的功能,比如上拉加载,item 动画效果,空布局等。
github 介绍
项目地址
说明文档地址
最新版本地址
练习项目 GitHub 地址
基础使用
「参考」 练习项目里的 BaseQuickAdapterActivity 相关。
相关属性
| 属性 | 功能 | 备注 |
|---|---|---|
| setList() | 使用新的数据集合,改变原有数据集合内容 | 不会替换原有的内存引用,只是替换内容 |
导入方式
- 第一步
在项目的 settings.gradle 文件中添加 jitpack
repositories {
maven { url 'https://jitpack.io' }
}
- 第二步
在项目 app 的 build.gradle 文件中添加 BaseRecyclerViewAdapterHelper
「注意」:具体版本号请到官方库查看
//BaseRecyclerViewAdapterHelper
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.11'
代码实现列表
- BaseQuickAdapterActivity 文件:
package com.elaine.lib_baserecyclerviewadapterhelper.basequickadapterPackage
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import com.elaine.lib_baserecyclerviewadapterhelper.R
import com.elaine.lib_baserecyclerviewadapterhelper.bean.BaseBean
import com.elaine.lib_baserecyclerviewadapterhelper.databinding.ActivityBaseQuickAdapterBinding
/**
* 基础使用--BaseQuickAdapter
*/
class BaseQuickAdapterActivity : AppCompatActivity() {
//布局
private lateinit var mBinding: ActivityBaseQuickAdapterBinding
//适配器
private lateinit var baseQuickAdapterAdapter: BaseQuickAdapterAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//布局赋值
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_base_quick_adapter)
initAdapter()
initData()
}
/**
* 初始化适配器
*/
private fun initAdapter() {
//构建适配器
baseQuickAdapterAdapter = BaseQuickAdapterAdapter()
mBinding.rvData.apply {
//RecycleView设置layoutManager
layoutManager = LinearLayoutManager(this@BaseQuickAdapterActivity)
//RecycleView设置adapter
adapter = baseQuickAdapterAdapter
}
}
/**
* 填充数据
*/
private fun initData() {
//构建数据
val data: MutableList<BaseBean> = ArrayList()
for (i in 0..20) {
val baseBean = BaseBean()
baseBean.content = "基础使用(BaseQuickAdapter)---数据 $i"
data.add(baseBean)
}
//适配器添加数据
baseQuickAdapterAdapter.setList(data)
}
}
- BaseQuickAdapterAdapter 文件
package com.elaine.lib_baserecyclerviewadapterhelper.basequickadapterPackage
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder
import com.elaine.lib_baserecyclerviewadapterhelper.R
import com.elaine.lib_baserecyclerviewadapterhelper.bean.BaseBean
import com.elaine.lib_baserecyclerviewadapterhelper.databinding.ItemBaseQuickAdapterBinding
/**
* 基础使用--BaseQuickAdapter
* 适配器
*/
class BaseQuickAdapterAdapter :
BaseQuickAdapter<BaseBean?, BaseDataBindingHolder<ItemBaseQuickAdapterBinding>>(R.layout.item_base_quick_adapter) {
override fun convert(
holder: BaseDataBindingHolder<ItemBaseQuickAdapterBinding>,
item: BaseBean?
) {
val mBinding = holder.dataBinding
if (mBinding != null) {
//赋值实体
if (item != null) {
mBinding.bean = item
}
//更新内容
mBinding.executePendingBindings()
}
}
}
- BaseBean 文件
package com.elaine.lib_baserecyclerviewadapterhelper.bean
/**
* 基础实体
*/
class BaseBean {
//内容
var content: String? = null
}
- activity_base_quick_adapter 文件
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".basequickadapterPackage.BaseQuickAdapterActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_data"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>
- item_base_quick_adapter 文件
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="bean"
type="com.elaine.lib_baserecyclerviewadapterhelper.bean.BaseBean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@{bean.content}"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
效果图如下
动画效果
「参考」 练习项目里的 AnimationActivity 相关。
相关属性
| 属性 | 功能 |
|---|---|
| setAnimationWithDefault() | 使用内置默认动画设置 |
| isAnimationFirstOnly | 动画是否仅第一次执行 |
| animationEnable | 是否打开动画 |
| adapterAnimation | 设置自定义动画 |
默认动画类型
| 类型 | 效果 |
|---|---|
| AlphaIn | 透明度进入 |
| ScaleIn | 缩放进入 |
| SlideInBottom | 从底部进入 |
| SlideInLeft | 从左侧进入 |
| SlideInRight | 从右侧进入 |
自定义动画
package com.elaine.lib_baserecyclerviewadapterhelper.animationpackage
import android.animation.Animator
import android.animation.ObjectAnimator
import android.view.View
import android.view.animation.DecelerateInterpolator
import com.chad.library.adapter.base.animation.BaseAnimation
/**
* 官方demo提供的自定义动画
* X轴和Y轴从1.3f到1f
* 同时透明度从0f到1f
*/
class CustomAnimation : BaseAnimation {
override fun animators(view: View): Array<Animator> {
//动画
val scaleY: Animator = ObjectAnimator.ofFloat(view, "scaleY", 1.3f, 1f)
val scaleX: Animator = ObjectAnimator.ofFloat(view, "scaleX", 1.3f, 1f)
val alpha: Animator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f)
//过度时间
scaleY.duration = 350
scaleX.duration = 350
alpha.duration = 350
//设置插值器
scaleY.interpolator = DecelerateInterpolator()
scaleX.interpolator = DecelerateInterpolator()
return arrayOf(scaleY, scaleX, alpha)
}
}
代码实现
//默认动画效果
animationAdapter.setAnimationWithDefault(BaseQuickAdapter.AnimationType.SlideInBottom)
//自定义动画效果
animationAdapter.adapterAnimation = CustomAnimation()
//动画是否执行一次 false--上下滑动都会执行动画;true--出现过的item不再执行动画
animationAdapter.isAnimationFirstOnly = false
//是否有动画效果 true--是;false--否
animationAdapter.animationEnable = true
效果图
- AlphaIn 透明度
- ScaleIn 缩放
- SlideInBottom 从底部进入
- SlideInLeft 从左侧进入
- SlideInRight 从右侧进入
- 自定义动画