本篇为github开源项目BRVAH的使用指南以及包含常见问题会第一时间更新最新的使用方法。最新版本请查看releases,由于持续更新,建议点赞收藏,便于查看。
文章目录
- 框架引入
- 使用Adapter
- 添加Item事件
- 添加列表加载动画
- 添加头部、尾部
- 自动加载
- 分组布局
- 多布局
- 设置空布局
- 添加拖拽、滑动删除
- 树形列表
- 自定义ViewHolder
- 扩展框架
框架引入
先在 build.gradle(Project:XXXX) 的 repositories 添加:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
然后在 build.gradle(Module:app) 的 dependencies 添加:
dependencies {
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:VERSION_CODE'
}
用这里的真实发行版本号, 替换 VERSION_CODE
注意: 一旦出现加载失败的情况,只有两种情况:
1. 配置没配置好
配置没配置好,有几种情况:
1. 只配置了dependencies
2. 配置repositories,但是位置错了,build.gradle(Project:XXXX) 文件下的repositories有两个,一个是buildscript下面的,一个是allprojects下面的,要配置到allprojects下面才是对的。
3. 版本号前面多一个v,这个是我的锅,在2.1.2版本之前都是带v的,之后(包含2.1.2)都不需要带v。
2. 网络原因(这个就不解释了)
使用Adapter
和原始的adapter相对,减少70%的代码量。
使用代码
public class QuickAdapter extends BaseQuickAdapter<Status, BaseViewHolder> {
public QuickAdapter() {
super(R.layout.tweet, DataServer.getSampleData());
}
@Override
protected void convert(BaseViewHolder viewHolder, Status item) {
viewHolder.setText(R.id.tweetName, item.getUserName())
.setText(R.id.tweetText, item.getText())
.setText(R.id.tweetDate, item.getCreatedAt())
.setVisible(R.id.tweetRT, item.isRetweet())
.linkify(R.id.tweetText);
Glide.with(mContext).load(item.getUserAvatar()).crossFade().into((ImageView) viewHolder.getView(R.id.iv));
}
}
使用
首先需要继承BaseQuickAdapter
,然后BaseQuickAdapter<Status, BaseViewHolder>
第一个泛型Status
是数据实体类型,第二个BaseViewHolder
是ViewHolder其目的是为了支持扩展ViewHolder。
赋值
可以直接使用viewHolder
对象点相关方法通过传入viewId和数据进行,方法支持链式调用。如果是加载网络图片或自定义view可以通过helper.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) {
Log.d(TAG, "onItemLongClick: ");
Toast.makeText(ItemClickActivity.this, "onItemLongClick" + position, Toast.LENGTH_SHORT).show();
return false;
}
});
Item子控件的点击事件
首先在adapter的convert方法里面通过viewHolder.addOnClickListener
绑定一下的控件id
@Override
protected void convert(BaseViewHolder viewHolder, Status item) {
viewHolder.setText(R.id.tweetName, item.getUserName())
.setText(R.id.tweetText, item.getText())
.setText(R.id.tweetDate, item.getCreatedAt())
.setVisible(R.id.tweetRT, item.isRetweet())
.addOnClickListener(R.id.tweetAvatar)
.addOnClickListener(R.id.tweetName)
.linkify(R.id.tweetText);
}
然后在设置
adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public boolean onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
Log.d(TAG, "onItemChildClick: ");
Toast.makeText(ItemClickActivity.this, "onItemChildClick" + position, Toast.LENGTH_SHORT).show();
return false;
}
});
Item子控件的长按事件
步骤同上使用方法不同。
adapter中绑定方法将addOnClickListener
改成addOnLongClickListener
.
设置点击事件方法setOnItemChildClickListener
改成setOnItemChildLongClickListener
注意:设置子控件的事件,如果不在adapter中绑定,点击事件无法生效,因为无法找到你需要设置的控件。
如果需要在点击事件中获取其他子控件可以使用:
getViewByPosition(RecyclerView recyclerView, int position,