www.recyclerview.org
BRVAH是一个强大的RecyclerAdapter框架(什么是RecyclerView?),它能节约开发者大量的开发时间,集成了大部分列表常用需求解决方案。为什么会有它?请查看「Android开源框架BRVAH由来篇」该框架于2016年4月10号发布的第1个版本到现在已经一年多了,经历了800多次代码提交,140多次版本打包,修复了1000多个问题,获得了9000多star,非常感谢大家的使用以及反馈。
本篇为BRVAH的使用指南以及包含常见问题会第一时间更新最新的使用方法。最新版本请查看releases,由于持续更新。
文章目录
框架引入
优化Adapter代码
和原始的adapter相对,减少70%的代码量。
添加Item事件
Item的点击事件
Item的长按事件
Item子控件的点击事件
Item子控件的长按事件
添加列表加载动画
一行代码轻松切换5种默认动画。
添加头部、尾部
一行代码搞定,感觉又回到ListView时代。
自动加载
上拉加载无需监听滑动事件,可自定义加载布局,显示异常提示,自定义异常提示。同时支持下拉加载。
分组布局
随心定义分组头部。
多布局
简单配置、无需重写额外方法。
设置空布局
比Listview的setEmptyView还要好用。
添加拖拽、滑动删除
开启,监听即可,就是这么简单。
树形列表
比ExpandableListView还要强大,支持多级。
自定义ViewHolder
支持自定义ViewHolder,让开发者随心所欲。
扩展框架
组合第三方框架,轻松实现更多需求定制。
框架引入
先在 build.gradle(Project:XXXX) 的 repositories 添加:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
然后在 build.gradle(Module:app) 的 dependencies 添加:
dependencies {
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
}
注意
版本:2.9.28
Change the method setVisible --> setGone
The new method setVisible
setVisible:Set a view visibility to VISIBLE (true) or INVISIBLE (false).
setGone: Set a view visibility to VISIBLE (true) or GONE (false).
注意: 一旦出现加载失败的情况,只有两种情况:
配置没配置好
配置没配置好,有几种情况:
1. 只配置了dependencies
2. 配置repositories,但是位置错了,build.gradle(Project:XXXX) 文件下的repositories有两个,一个是buildscript下面的,一个是allprojects下面的,要配置到allprojects下面才是对的。
3. 版本号前面多一个v,这个是我的锅,在2.1.2版本之前都是带v的,之后(包含2.1.2)都不需要带v。
网络原因(这个就不解释了)
使用Adapter
和原始的adapter相对,减少70%的代码量。
使用代码
public class HomeAdapter extends BaseQuickAdapter {
public HomeAdapter(int layoutResId, List data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, HomeItem item) {
helper.setText(R.id.text, item.getTitle());
helper.setImageResource(R.id.icon, item.getImageResource());
// 加载网络图片
Glide.with(mContext).load(item.getUserAvatar()).crossFade().into((ImageView) helper.getView(R.id.iv));
}
}
使用
首先需要继承BaseQuickAdapter,然后BaseQuickAdapter第一个泛型Status是数据实体类型,第二个BaseViewHolder是ViewHolder其目的是为了支持扩展ViewHolder。
赋值
可以直接使用viewHolder对象点相关方法通过传入viewId和数据进行,方法支持链式调用。如果是加载网络图片或自定义view可以通过viewHolder.getView(viewId)获取该控件。
常用方法
viewHolder.getLayoutPosition() 获取当前item的position
常见问题
这些问题不是使用该库的问题,但是经常有人问这些问题,所以特意写出来,帮助后续遇到以下问题的开发者们。
为什么有数据不显示?
请检查一下你的RecyclerView是否设置了LayoutManager。
为什么有10条数据,只显示1条?
请检查一下item的布局最外层的Layout是不是layout_height设置了match_parent.
数据状态错乱
这个问题无论是RecyclerView还是ListView不做处理都会出现问题,这个本质上是由于布局重用机制导致的,解决办法是通过数据状态来控制控件的状态,一定要设置状态无论什么状态,if和else是少不了的,如下代码:
if(entity.isCheck){
checkBox.isChecked(true);
} else {
checkBox.isChecked(false);
}
解决缓存问题案例:
添加Item事件
Item的点击事件
adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
Log.d(TAG, "onItemClick: ");
Toast.makeText(ItemClickActivity.this, "onItemClick" + position, Toast.LENGTH_SHORT).show();
}
});
Item的长按事件
adapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {