ByRecyclerView:只為改變BRVAH加載更多機(jī)制/addHeaderView的問題

ByRecyclerView 是主要是為了解決XRecyclerView和BRVAH其中的問題而產(chǎn)生的RecyclerView開源庫。

它其中的功能有:自帶下拉刷新或結(jié)合SwipeRefreshLayout、觸底加載更多、添加/移除多個HeaderView/FooterView、狀態(tài)布局StateView、點擊/長按事件、萬能分割線、優(yōu)化過的極簡Adapter(databinding)等。

本庫已經(jīng)更新了15個版本了,發(fā)布了近四個月,現(xiàn)在的功能都是剛需,已滿足基本的項目需求,后續(xù)會一直維護(hù)下去增加更多的功能。希望能幫助到之前和我同一境遇的人,還請大家多多支持。

GitHub地址: ByRecyclerView,歡迎Star

文章目錄

為什么有 ByRecyclerView?

1. 最早 XRecyclerView

很久之前一直用的是XRecyclerView,此庫可以進(jìn)行下拉刷新和加載更多,但是有很多致命的問題,例如:

  • 1.自定義下拉刷新和加載更多布局時不方便,只能設(shè)置簡單的樣式。
  • 2.不能在此基礎(chǔ)上使用SwipeRefreshLayout,會有滑動沖突問題。
  • 3.不能在CoordinatorLayout + AppBarLayout中使用(作者后期已經(jīng)修復(fù),但是由于項目是拷貝的所以不便更新維護(hù))。
  • 4.不能設(shè)置EmptyView,或者不是以一個item形式添加,導(dǎo)致不能同時出現(xiàn)頭布局和空布局
  • 5.不能添加FooterView
  • 6.不能設(shè)置item點擊事件
  • 7.需要自己實現(xiàn)BaseRecyclerViewAdapter

為了解決上面的問題,我在項目中到處打補(bǔ)丁,但是治標(biāo)不治本,導(dǎo)致我不得不選擇新的RecyclerView庫來滿足我的業(yè)務(wù)需求。
于是看中了萬眾矚目的BaseRecyclerViewAdapterHelper,這個現(xiàn)有18.7k star的開源庫。

2. 選擇 BaseRecyclerViewAdapterHelper

BRVAH 幾乎可以解決上面所有的問題,并且使用簡單,我在公司新項目中使用了它,但是不久我就遇到了新的問題:

  • 1.addHeaderView()是在一個item中操作的,導(dǎo)致我不能順利使用錨點(滑動時,通過定位第一個item的位置來更改指示器)。如果使用多類型item會復(fù)雜很多,我需要對數(shù)據(jù)實現(xiàn)對應(yīng)的多類型接口來達(dá)到目的。
    • 錨點效果
      錨點效果
  • 2.不滿一屏自動加載。這個功能導(dǎo)致有很多不必要的接口請求,每次進(jìn)入不滿一屏的頁面都會請求兩次,實在看不過去。設(shè)計講究所見即所得,不要亂替我執(zhí)行動作行為。查看這位無奈的開發(fā),項目里提的issue很多是關(guān)于這部分的。
  • 3.自定義下拉刷新布局得引入其他的下拉刷新庫,有點冗余。

前兩個應(yīng)該是此庫比較大的兩個槽點,導(dǎo)致我使用起來還是不那么稱心如意。當(dāng)然此庫絕大部分的功能都是好用的。

3. 最終 ByRecyclerView

于是就有了ByRecyclerView,它基本解決了上面的所有問題:

  • 不滿一屏,上拉才執(zhí)行加載更多;滿一屏后觸底加載更多
  • 可設(shè)置自己的下拉刷新頭,并可自定義下拉刷新布局和加載更多布局
  • 也可配合SwipeRefreshLayout使用
  • 可添加/刪除 HeaderView(多類型) / FooterView / StateView
  • ByRecyclerViewAdapter分離,意味著開發(fā)者之前使用自定義的BaseAdapter,會無縫銜接ByRecyclerView,完全可替換XRecyclerView,只需更換少量方法。
  • 可設(shè)置item及子view的點擊事件/長按事件
  • 可設(shè)置任意自定義行間距(自帶ItemDecoration)
  • 結(jié)合databindingBaseBindingAdapter(ListView的adapter也有)
  • 提供AndroidXSupport包引入

與 BRVAH、XRecyclerView對比

ByRecyclerView BRVAH XRecyclerView
下拉刷新布局 繼承基類自定義布局 只能簡單設(shè)置樣式
SwipeRefreshLayout 可配合使用 可配合使用 不能使用
加載更多布局 繼承基類自定義布局 繼承基類設(shè)置簡單布局 繼承基類自定義類
加載更多機(jī)制 不足一屏上拉加載,超過后觸底加載 不足一屏即加載 觸底加載
HeaderView 多ViewType區(qū)別 同一個item 多ViewType區(qū)別
FooterView 同一個item 同一個item 不能添加
EmptyView 可設(shè)置 可設(shè)置 不能設(shè)置
點擊/長按事件

ByRecyclerView 是XRecyclerView的拓展,可完全替換XRecyclerView,對于BRVAH它的優(yōu)勢在于四點:

  • 1.headerView使用的是多type的形式,即一個header就是一個position
  • 2.不足一屏上拉加載,超過后觸底加載
  • 3.自帶下拉加載布局,也可使用三方刷新框架,比如SwipeRefreshLayout
  • 4.萬能分割線(LinearLayout / GridLayout / StaggeredGridLayout)

缺點是還沒有BRVAH里的部分功能,比如分組adapter、DiffUtils、item擴(kuò)展動畫...后期會逐步完善。

具體功能

  • 1.支持 下拉刷新、加載更多
  • 2.可隨意切換 自帶下拉刷新布局 / SwipeRefreshLayout
  • 3.加載更多機(jī)制:不足一屏上拉加載,超過后觸底加載(所見即所得)
  • 4.可設(shè)置自定義 下拉刷新布局 和 加載更多布局
  • 5.添加/移除 HeaderView、FooterView
  • 6.設(shè)置空布局 EmptyView
  • 7.添加item的點擊/長按事件
  • 8.優(yōu)化過的BaseAdapter (RecyclerView / ListView),減少大量代碼
  • 9.Adapter結(jié)合DataBinding使用 (RecyclerView / ListView)
  • 10.可添加萬能分隔線(LinearLayout / GridLayout / StaggeredGridLayout)
  • 11.默認(rèn)使用AndoridX,且支持Support

下載試用

App-Demo(AndroidX版本)

download

部分效果演示

刷新操作 設(shè)置狀態(tài)布局
刷新操作
設(shè)置狀態(tài)布局
多類型列表(線性/宮格/瀑布流) 分割線(線性/宮格/瀑布流)
多類型列表
分割線

使用文檔

簡單接入

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.代碼設(shè)置

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);   // 設(shè)置第一頁數(shù)據(jù)
// 下拉刷新監(jiān)聽
mRecyclerView.setOnRefreshListener(new ByRecyclerView.OnRefreshListener() {
            @Override
            public void onRefresh() {
                // 刷新完成
                mRecyclerView.setRefreshing(false);
            }
        });
// 加載更多監(jiān)聽
mRecyclerView.setOnLoadMoreListener(new ByRecyclerView.OnLoadMoreListener() {
    @Override
    public void onLoadMore() {
         mAdapter.addData(list);            // 設(shè)置及刷新數(shù)據(jù)
         mRecyclerView.loadMoreComplete();  // 加載更多完成 
         mRecyclerView.loadMoreEnd();       // 沒有更多內(nèi)容了
         mRecyclerView.loadMoreFail();      // 加載更多失敗
    }
});

詳細(xì)使用請見Wiki:ByRecyclerView/wiki

Wiki目錄:

1 引入及極速設(shè)置
 - 1.1 引入
 - 1.2 極速設(shè)置

2 ByRecyclerView
 - 2.1 使用自帶下拉刷新
 - 2.2 使用加載更多
 - 2.3 添加item點擊事件
 - 2.4 添加item長按事件
 - 2.5 addHeaderView(多type)
 - 2.6 addFooterView
 - 2.7 setStateView(多種狀態(tài))
 - 2.8 設(shè)置不滿一屏不加載
 - 2.9 設(shè)置加載更多底部間距
 - 2.10 自定義下拉刷新布局
 - 2.11 自定義加載更多布局
 - 2.12 添加子View的點擊事件
 - 2.13 添加子View的長按事件

3 Adapter
 - 3.1 單類型列表
 - 3.2 單類型列表(databinding)
 - 3.3 多類型列表實現(xiàn)

4 ItemDecoration
 - 4.1 給線性布局設(shè)置分割線
 - 4.2 給宮格/瀑布流設(shè)置分割線

感謝與參考

ByRecyclerView借鑒了XRecyclerView下拉刷新、加載更多邏輯;BaseViewHolder及FooterView部分借鑒了BaseRecyclerViewAdapterHelper的BaseHolder,非常感謝!

End

大家有任何問題可以直接提Issues,也可以加入到答疑群:831860628,我會第一時間幫助大家解決。如果此庫幫助到了你,還請給個Star、Fork、Follow,非常感謝??。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容