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

相關文章
相關標籤/搜索