ByRecyclerView:更方便的使用下拉刷新及加载更多

5,300 阅读6分钟

ByRecyclerView 是主要是为了解决XRecyclerView和BRVAH其中的问题而产生的RecyclerView开源库。

它其中的功能有:自带下拉刷新或结合SwipeRefreshLayout、触底加载更多、添加/移除多个HeaderView/FooterView、状态布局StateView、点击/长按事件、万能分割线、优化过的极简Adapter(databinding)等。

本库已经更新了15个版本了,发布了近四个月,现在的功能都是刚需,已满足基本的项目需求,后续会一直维护下去增加更多的功能。希望能帮助到之前和我同一境遇的人,还请大家多多支持。

GitHub地址: ByRecyclerView,欢迎Star

文章目录

为什么有 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
  • ByRecyclerViewAdapter分离,意味着开发者之前使用自定义的BaseAdapter,会无缝衔接ByRecyclerView,完全可替换XRecyclerView,只需更换少量方法。
  • 可设置item及子view的点击事件/长按事件
  • 可设置任意自定义行间距(自带ItemDecoration)
  • 结合databindingBaseBindingAdapter(ListView的adapter也有)
  • 提供AndroidXSupport包引入

与 BRVAH、XRecyclerView对比

ByRecyclerViewBRVAHXRecyclerView
下拉刷新布局继承基类自定义布局只能简单设置样式
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引入

allprojects {
	repositories {
		...
		maven { url "https://jitpack.io" }
	}
}
dependencies {
	implementation 'com.github.youlookwhat:ByRecyclerView:1.0.9'         // AndroidX版本引入
	implementation "com.github.youlookwhat:ByRecyclerView:1.0.9-support" // support版本引入
}

2.在XML布局中引用 ByRecyclerView

<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.代码设置

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);   // 设置第一页数据
// 下拉刷新监听
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目录:

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 给宫格/瀑布流设置分割线

感谢与参考

ByRecyclerView借鉴了XRecyclerView下拉刷新、加载更多逻辑;BaseViewHolder及FooterView部分借鉴了BaseRecyclerViewAdapterHelper的BaseHolder,非常感谢!

End

大家有任何问题可以直接提Issues,也可以加入到答疑群:831860628,我会第一时间帮助大家解决。如果此库帮助到了你,还请给个Star、Fork、Follow,非常感谢😁。