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

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

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,非常感谢😁。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容