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
-
ByRecyclerView
與Adapter
分離财松,意味著開發(fā)者之前使用自定義的BaseAdapter
瘪贱,會無縫銜接ByRecyclerView
,完全可替換XRecyclerView
辆毡,只需更換少量方法菜秦。 - 可設(shè)置item及子view的點擊事件/長按事件
- 可設(shè)置任意自定義行間距(自帶ItemDecoration)
- 結(jié)合
databinding
的BaseBindingAdapter
(ListView的adapter也有) - 提供
AndroidX
和Support
包引入
與 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
下載試用
部分效果演示
刷新操作 | 設(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至耻,非常感謝??。
- 通過QQ聯(lián)系我:770413277
- GitHub地址:https://github.com/youlookwhat
- 本項目地址:youlookwhat/ByRecyclerView