学习目标
熟悉使用 BRVAH 解决对应各种 adapter 需求
概述
BRVAH 是 Github 上的一个很棒的开源项目,主要作用是帮助我们更加高效的使用 Recyclerview 控件,处理项目中常见需求的 Adapter,使用起来非常方便,更多介绍可去BRVAH官网查看。
BRVAH 主要是针对 Adapter 来设计的。
BRVAH 为我们提供了一般情况下的BaseQuickAdapter
,和几个特定需求下的Adapter,BaseMultiItemQuickAdapter
用于复杂类布局列表;BaseItemDraggableAdapter
用于拖拽移动和滑动删除类列表; BaseSectionQuickAdapter
用于带 Section 头部 View 的列表。
build.gradle 配置说明
添加资源库
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
添加依赖
dependencies {
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:VERSION_CODE'
}
VERSION_CODE
的最新版本可以参考这里。
功能概要说明
1. 实现Recyclerview的列表加载动画效果
我们只需将自建的 xxAdapter 继承 BRVAH 对应满足需求的 Adapter,然后在 Activity 中实例化,通过openLoadAnimation()
方法完成特定的动画效果。
BRVAH 支持 5 种动画,BaseQuickAdapter.ALPHAIN
淡入、BaseQuickAdapter.SLIDEIN_BOTTOM
从底部入、BaseQuickAdapter.SLIDEIN_LEFT
从左边进入、BaseQuickAdapter.SLIDEIN_RIGHT
从右边进入和自定义动画。
关于自定义的动画,可以通过实现 BaseAnimation
这个类,重写
getAnimators(View view)
方法来完成自定义动画。
2. 实现Recyclerview的复杂布局列表
在实际应用中经常会遇到各种样式的列表、宫格和列表同时存在、分类列表等情况。
2.1 Recyclerview 多样式 item 排列的效果
对于多样式的列表,根据需求创建 type 实体类实现 MultiItemEntity。 xxAdapter继承 BaseMultiItemQuickAdapter
类,在构造方法中调用addItemType ()
方法加入定义的 itemType 和对应布局,在 Activity 中实例化即可。
2.2 Recyclerview 宫格和列表的混排样式
关于 Grid 和 List 的混排样式,Grid 样式是一行有多个,而 List 样式是一行只有一个。我们可以把 List 样式看成是 Grid 样式,它就相当于把一个 Grid 的 item 拉长了的样子。
列表与网格混排的布局效果,我们可以创建 xxAdapter 继承 BaseMultiItemQuickAdapter
添加对应 item 类型的布局文件,在 Activity 中创建 GridLayoutManager
对象,设置 spanSize
属性,通过 Adapter 的 setSpanSizeLookup
方法设置每种 item 类型对应的 spanSize。设置 Recyclerview 的 addItemDecoration()
方法设置添加分割线或设置 item 间距。
代码片段:
...
gridLayoutManager = new GridLayoutManager(this,3);
mRecyclerView.setLayoutManager(gridLayoutManager);
mAdapter = new GridManagerAdapter(getDataType());
// 设置横跨度
// 1:就是横跨1/3
// 2:就是横跨2/3
// 3:就是横跨一整行
mAdapter.setSpanSizeLookup(new BaseQuickAdapter.SpanSizeLookup() {
@Override
public int getSpanSize(GridLayoutManager gridLayoutManager, int position) {
return getDataType().get(position).getSpanSize();
}
});
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams)
view.getLayoutParams();
int spanSize = layoutParams.getSpanSize();
int spanIndex = layoutParams.getSpanIndex();// 从左到右 0~
if (spanSize == gridLayoutManager.getSpanCount()) {
outRect.top = 20;
}
}
});
// 假设数据
private List<MultipleItem> getDataType() {
int type = 0;
for (int i = 0;i < 13;i++) {
if (i < 9) {
type = 1;
}