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

為了解決上面的問題,我在項目中到處打補丁谭企,但是治標(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)系作者
  • 序言:七十年代末镊叁,一起剝皮案震驚了整個濱河市尘颓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌意系,老刑警劉巖泥耀,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛔添,居然都是意外死亡痰催,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門迎瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夸溶,“玉大人,你說我怎么就攤上這事凶硅》觳茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵足绅,是天一觀的道長捷绑。 經(jīng)常有香客問我,道長氢妈,這世上最難降的妖魔是什么粹污? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮首量,結(jié)果婚禮上壮吩,老公的妹妹穿的比我還像新娘。我一直安慰自己加缘,他們只是感情好鸭叙,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拣宏,像睡著了一般沈贝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚀浆,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天缀程,我揣著相機(jī)與錄音搜吧,去河邊找鬼市俊。 笑死杨凑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摆昧。 我是一名探鬼主播撩满,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绅你!你這毒婦竟也來了伺帘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤耗美,失蹤者是張志新(化名)和其女友劉穎董习,沒想到半個月后饭耳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡张咳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了似舵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚猾。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砚哗,靈堂內(nèi)的尸體忽然破棺而出龙助,到底是詐尸還是另有隱情,我是刑警寧澤蛛芥,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布提鸟,位于F島的核電站,受9級特大地震影響仅淑,放射性物質(zhì)發(fā)生泄漏称勋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一漓糙、第九天 我趴在偏房一處隱蔽的房頂上張望铣缠。 院中可真熱鬧,春花似錦昆禽、人聲如沸蝗蛙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捡硅。三九已至,卻和暖如春盗棵,著一層夾襖步出監(jiān)牢的瞬間壮韭,已是汗流浹背北发。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留喷屋,地道東北人琳拨。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像屯曹,于是被迫代替她去往敵國和親狱庇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容