ByRecyclerView 是主要是为了解决XRecyclerView和BRVAH其中的问题而产生的RecyclerView开源库。
它其中的功能有:自带下拉刷新或结合SwipeRefreshLayout、触底加载更多、添加/移除多个HeaderView/FooterView、状态布局StateView、点击/长按事件、万能分割线、优化过的极简Adapter(databinding)等。
本库已经更新了15个版本了,发布了近四个月,现在的功能都是刚需,已满足基本的项目需求,后续会一直维护下去增加更多的功能。希望能帮助到之前和我同一境遇的人,还请大家多多支持。
GitHub地址: ByRecyclerView,欢迎Star
文章目录
- 为什么会有ByRecyclerView?
- 1. 最早 XRecyclerView
- 2. 选择 BaseRecyclerViewAdapterHelper
- 3. 最终 ByRecyclerView
- 与BRVAH、XRecyclerView对比
- 具体功能
- 使用文档
- 参考与感谢
- End
为什么有 ByRecyclerView?
1. 最早 XRecyclerView
很久之前一直用的是XRecyclerView
,此库可以进行下拉刷新和加载更多,但是有很多致命的问题,例如:
- 1.自定义下拉刷新和加载更多布局时不方便,只能设置简单的样式。
- 2.不能在此基础上使用
SwipeRefreshLayout
,会有滑动冲突问题。 - 3.不能在
CoordinatorLayout
AppBarLayout
中使用(作者后期已经修复,但是由于项目是拷贝的所以不便更新维护)。 - 4.不能设置EmptyView,或者不是以一个item形式添加,导致不能同时出现头布局和空布局
- 5.不能添加FooterView
- 6.不能设置item点击事件
- 7.需要自己实现BaseRecyclerViewAdapter
为了解决上面的问题,我在项目中到处打补丁,但是治标不治本,导致我不得不选择新的RecyclerView库来满足我的业务需求。
于是看中了万众瞩目的BaseRecyclerViewAdapterHelper
,这个现有18.7k star的开源库。
2. 选择 BaseRecyclerViewAdapterHelper
BRVAH 几乎可以解决上面所有的问题,并且使用简单,我在公司新项目中使用了它,但是不久我就遇到了新的问题:
- 1.addHeaderView()是在一个item中操作的,导致我不能顺利使用锚点(滑动时,通过定位第一个item的位置来更改指示器)。如果使用多类型item会复杂很多,我需要对数据实现对应的多类型接口来达到目的。
- 锚点效果
锚点效果
- 2.不满一屏自动加载。这个功能导致有很多不必要的接口请求,每次进入不满一屏的页面都会请求两次,实在看不过去。设计讲究
所见即所得
,不要乱替我执行动作行为。查看这位无奈的开发,项目里提的issue很多是关于这部分的。 - 3.自定义下拉刷新布局得引入其他的下拉刷新库,有点冗余。
前两个应该是此库比较大的两个槽点,导致我使用起来还是不那么称心如意。当然此库绝大部分的功能都是好用的。
3. 最终 ByRecyclerView
于是就有了ByRecyclerView
,它基本解决了上面的所有问题:
- 不满一屏,上拉才执行加载更多;满一屏后触底加载更多
- 可设置自己的下拉刷新头,并可自定义下拉刷新布局和加载更多布局
- 也可配合
SwipeRefreshLayout
使用 - 可添加/删除 HeaderView(多类型) / FooterView / StateView
-
ByRecyclerView
与Adapter
分离,意味着开发者之前使用自定义的BaseAdapter
,会无缝衔接ByRecyclerView
,完全可替换XRecyclerView
,只需更换少量方法。 - 可设置item及子view的点击事件/长按事件
- 可设置任意自定义行间距(自带ItemDecoration)
- 结合
databinding
的BaseBindingAdapter
(ListView的adapter也有) - 提供
AndroidX
和Support
包引入
与 BRVAH、XRecyclerView对比
ByRecyclerView | BRVAH | XRecyclerView | |
---|---|---|---|
下拉刷新布局 | 继承基类自定义布局 | 无 | 只能简单设置样式 |
SwipeRefreshLayout | 可配合使用 | 可配合使用 | 不能使用 |
加载更多布局 | 继承基类自定义布局 | 继承基类设置简单布局 | 继承基类自定义类 |
加载更多机制 | 不足一屏上拉加载,超过后触底加载 | 不足一屏即加载 | 触底加载 |
HeaderView | 多ViewType区别 | 同一个item | 多ViewType区别 |
FooterView | 同一个item | 同一个item | 不能添加 |
EmptyView | 可设置 | 可设置 | 不能设置 |
点击/长按事件 | 有 | 有 | 无 |
ByRecyclerView 是XRecyclerView的拓展,可完全替换XRecyclerView,对于BRVAH它的优势在于四点:
- 1.headerView使用的是多type的形式,即一个header就是一个position
- 2.不足一屏上拉加载,超过后触底加载
- 3.自带下拉加载布局,也可使用三方刷新框架,比如SwipeRefreshLayout
- 4.万能分割线(LinearLayout / GridLayout / StaggeredGridLayout)
缺点是还没有BRVAH里的部分功能,比如分组adapter、DiffUtils、item扩展动画...后期会逐步完善。
具体功能
- 1.支持 下拉刷新、加载更多
- 2.可随意切换 自带下拉刷新布局 / SwipeRefreshLayout
- 3.加载更多机制:不足一屏上拉加载,超过后触底加载(所见即所得)
- 4.可设置自定义 下拉刷新布局 和 加载更多布局
- 5.添加/移除 HeaderView、FooterView
- 6.设置空布局 EmptyView
- 7.添加item的点击/长按事件
- 8.优化过的BaseAdapter (RecyclerView / ListView),减少大量代码
- 9.Adapter结合DataBinding使用 (RecyclerView / ListView)
- 10.可添加万能分隔线(LinearLayout / GridLayout / StaggeredGridLayout)
- 11.默认使用AndoridX,且支持Support
下载试用
App-Demo(AndroidX版本)
download
部分效果演示
刷新操作 | 设置状态布局 |
---|---|
刷新操作 | 设置状态布局 |
多类型列表(线性/宫格/瀑布流) | 分割线(线性/宫格/瀑布流) |
---|---|
多类型列表 | 分割线 |
使用文档
简单接入
1.dependencie引入
代码语言:javascript复制allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
代码语言:javascript复制dependencies {
implementation 'com.github.youlookwhat:ByRecyclerView:1.0.9' // AndroidX版本引入
implementation "com.github.youlookwhat:ByRecyclerView:1.0.9-support" // support版本引入
}
2.在XML布局中引用 ByRecyclerView
代码语言:javascript复制<me.jingbin.library.ByRecyclerView
android:id="@ id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layoutManager="LinearLayoutManager"
tools:listitem="@layout/item_home" />
3.代码设置
代码语言:javascript复制mAdapter = new OneTypeAdapter(list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter);
public class OneTypeAdapter extends BaseRecyclerAdapter<String> {
public OneTypeAdapter(List<String> data) {
super(R.layout.item_main, data);
}
@Override
protected void bindView(BaseByViewHolder<String> holder, String bean, int position) {
holder.setText(R.id.view_bottom, bean);
}
}
mAdapter.setNewData(list); // 设置第一页数据
代码语言:javascript复制// 下拉刷新监听
mRecyclerView.setOnRefreshListener(new ByRecyclerView.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新完成
mRecyclerView.setRefreshing(false);
}
});
// 加载更多监听
mRecyclerView.setOnLoadMoreListener(new ByRecyclerView.OnLoadMoreListener() {
@Override
public void onLoadMore() {
mAdapter.addData(list); // 设置及刷新数据
mRecyclerView.loadMoreComplete(); // 加载更多完成
mRecyclerView.loadMoreEnd(); // 没有更多内容了
mRecyclerView.loadMoreFail(); // 加载更多失败
}
});
详细使用请见Wiki:ByRecyclerView/wiki
Wiki目录:
代码语言:javascript复制1 引入及极速设置
- 1.1 引入
- 1.2 极速设置
2 ByRecyclerView
- 2.1 使用自带下拉刷新
- 2.2 使用加载更多
- 2.3 添加item点击事件
- 2.4 添加item长按事件
- 2.5 addHeaderView(多type)
- 2.6 addFooterView
- 2.7 setStateView(多种状态)
- 2.8 设置不满一屏不加载
- 2.9 设置加载更多底部间距
- 2.10 自定义下拉刷新布局
- 2.11 自定义加载更多布局
- 2.12 添加子View的点击事件
- 2.13 添加子View的长按事件
3 Adapter
- 3.1 单类型列表
- 3.2 单类型列表(databinding)
- 3.3 多类型列表实现
4 ItemDecoration
- 4.1 给线性布局设置分割线
- 4.2 给宫格/瀑布流设置分割线
感谢与参考
- XRecyclerView
- BaseRecyclerViewAdapterHelper
ByRecyclerView借鉴了XRecyclerView下拉刷新、加载更多逻辑;BaseViewHolder及FooterView部分借鉴了BaseRecyclerViewAdapterHelper的BaseHolder,非常感谢!
End
大家有任何问题可以直接提Issues,也可以加入到答疑群:831860628,我会第一时间帮助大家解决。如果此库帮助到了你,还请给个Star、Fork、Follow,非常感谢?。
- GitHub地址:https://github.com/youlookwhat
- 本项目地址:youlookwhat/ByRecyclerView