ByRecyclerView:只为改变BRVAH加载更多机制/addHeaderView的问题

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

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

本库已经更新了16个版本了,发布了近四个月,如今的功能都是刚需,已知足基本的项目需求,后续会一直维护下去增长更多的功能。但愿能帮助到以前和我同一境遇的人,还请你们多多支持。git

GitHub地址: ByRecyclerView,欢迎Star

文章目录github

为何有 ByRecyclerView?

1. 最先 XRecyclerView

好久以前一直用的是XRecyclerView,此库能够进行下拉刷新和加载更多,可是有不少致命的问题,例如:maven

  • 1.自定义下拉刷新和加载更多布局时不方便,只能设置简单的样式。
  • 2.不能在此基础上使用SwipeRefreshLayout,会有滑动冲突问题。
  • 3.不能在CoordinatorLayout + AppBarLayout中使用(做者后期已经修复,可是因为项目是拷贝的因此不便更新维护)。
  • 4.不能设置EmptyView,或者不是以一个item形式添加,致使不能同时出现头布局和空布局
  • 5.不能添加FooterView
  • 6.不能设置item点击事件
  • 7.须要本身实现BaseRecyclerViewAdapter

为了解决上面的问题,我在项目中处处打补丁,可是治标不治本,致使我不得不选择新的RecyclerView库来知足个人业务需求。
因而看中了万众瞩目的BaseRecyclerViewAdapterHelper,这个现有18.7k star的开源库。ide

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对比

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引入

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,很是感谢😁。

相关文章
相关标签/搜索