Android端代碼量非常小的分頁加載庫
前言
RecyclerView幾乎在每個(gè)app里面都有被使用,但凡使用了列表就會(huì)采用分頁加載進(jìn)行數(shù)據(jù)請(qǐng)求和加載。android 官方也推出了分頁庫,但是感覺只有kotlin一起使用才能體會(huì)到酸爽。Java 版本的也有很多很強(qiáng)大的第三方庫,
BaseRecyclerViewAdapterHelper這個(gè)庫是我用起來最順手的分頁庫,里面也包含了各式各樣強(qiáng)大的功能:分組、拖動(dòng)排序、動(dòng)畫,因?yàn)楣δ軓?qiáng)大,代碼量也相對(duì)比較大。 但是很多時(shí)候我們想要的就是分頁加載,所以參照BaseRecyclerViewAdapterHelper寫下了這個(gè)分頁加載庫,只有分頁功能。(可以說照搬,也可以說精簡(jiǎn),但是其中也加入個(gè)人理解)。
這個(gè)庫相對(duì)BaseRecyclerViewAdapterHelper只有兩個(gè)優(yōu)點(diǎn):
- 代碼量小
- BaseRecyclerViewAdapterHelper 在數(shù)據(jù)不滿一屏?xí)r仍然顯示加載更多以及頁面初始化時(shí)都會(huì)顯示loadmoewView(雖然提供了api進(jìn)行隱藏,但是看了很長(zhǎng)時(shí)間注釋和文檔都沒了解該怎么使用),而這個(gè)庫在初次加載和不滿一屏數(shù)據(jù)時(shí)不會(huì)顯示loadmoreView
gradle引用
implementation 'com.maxcion:pageloadadapter:1.0.0'
項(xiàng)目地址:github.com/Likeyong/Pa…



單列分頁加載
//一定要在PageLoadRecyclerVewAdapter<String> 的泛型參數(shù)里面指定數(shù)據(jù)源item格式
public class SimpleAdapter extends PageLoadRecyclerVewAdapter<String> {
public SimpleAdapter(List<String> dataList) {
super(dataList);
}
//這里進(jìn)行 數(shù)據(jù)綁定
@Override
protected void convert(BaseViewHolder holder, String item) {
holder.setText(R.id.text, item);
}
//這里返回布局item id
@Override
protected int getItemLayoutId() {
return R.layout.item_simple;
}
}
第一步 adapter實(shí)現(xiàn)好了,現(xiàn)在需要打開adapter的分頁加載功能
public class SingleColumnActivity extends BaseActivity<String> implements IOnLoadMoreListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_column);
RecyclerView rv = findViewById(R.id.rv);
//實(shí)例化adapter
mAdapter = new SimpleAdapter(null);
//給adapter 設(shè)置loadmoreview
mAdapter.setLoadMoreView(new CommonLoadMoreView());
//設(shè)置滑動(dòng)到底部時(shí)進(jìn)行更多加載的回調(diào)
mAdapter.setOnLoadMoreListener(this);
rv.setAdapter(mAdapter);
rv.setLayoutManager(new LinearLayoutManager(this));
request();
}
@Override
public void onLoadMoreRequested() {
request();
}
//這個(gè)函數(shù)不用管
@Override
protected List<String> convertRequestData(List<String> originData) {
return originData;
}
}
第二步,RecyclerView也打開了分頁加載功能,第三部就是根據(jù)接口返回的數(shù)據(jù)判斷到底是 加載失敗了、加成成功了還是加載結(jié)束(沒有更多數(shù)據(jù)需要加載)
protected void request() {
NetWorkRequest.request(mAdapter.getDataSize() / PAGE_SIZE + 1, mFailCount, new NetWorkRequest.Callback() {
@Override
public void onSuccess(List<String> result) {
List<T> finalResult = convertRequestData(result);
if(result.size() >= PAGE_SIZE){// 接口返回了滿滿一頁的數(shù)據(jù),這里數(shù)據(jù)加載成功
if (mAdapter.getDataSize() == 0){
//當(dāng)前列表里面沒有數(shù)據(jù),代表是初次請(qǐng)求,所以這里使用setNewData()
mAdapter.setNewData(finalResult);
}else {
//列表里面已經(jīng)有數(shù)據(jù)了,這里使用addDataList(),將數(shù)據(jù)添加到列表后面
mAdapter.addDataList(finalResult);
}
//這里調(diào)用adapter。loadMoreComplete(true) 函數(shù)通知列表刷新footview, 這里參數(shù)一定要傳true
mAdapter.loadMoreComplete(true);
}else {
//如果接口返回的數(shù)據(jù)不足一頁,也就代表沒有足夠的數(shù)據(jù)了,那么也就沒有下一頁數(shù)據(jù),所以這里
//認(rèn)定分頁加載結(jié)束
//這里的參數(shù)也一定要傳true
mAdapter.loadMoreEnd(true);
}
}
@Override
public void onFail() {
mFailCount++;
//請(qǐng)求失敗 通知recyclerview 刷新footview 狀態(tài)
mAdapter.loadMoreFail(true);
}
});
}
上面是我寫的模擬接口請(qǐng)求,不用在意其他代碼,只要關(guān)注onSuccess 和onFail 兩個(gè)回調(diào)里面的邏輯。
混合布局的支持
在電商行業(yè)經(jīng)常能看到商品列表中,同一個(gè)列表,有的商品占滿整整一行,有的一行顯示2-3個(gè)商品。這種實(shí)現(xiàn)方案就是通過GridLayoutManager 的SpanSizeLookup 來控制每個(gè)item占幾列的。
RecyclerView rv = findViewById(R.id.rv);
mAdapter = new SimpleAdapter(null);
mAdapter.setLoadMoreView(new CommonLoadMoreView());
mAdapter.setOnLoadMoreListener(this);
//這里我們將列表設(shè)置最多兩列
GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//根據(jù)position 設(shè)置每個(gè)item應(yīng)該占幾列
//如果當(dāng)前的position是3的整數(shù)倍 我們就讓他占滿2列,其他的只占1列
return position % 3 == 0 ? 2 : 1 ;
}
});
rv.setLayoutManager(layoutManager);
rv.setAdapter(mAdapter);
RecyclerView多Type支持
如果要使用多type, 在寫Adapter的時(shí)候要繼承PageLoadMultiRecyclerViewAdapter<T, BaseViewHolder>,其中T 是數(shù)據(jù)源item類型,這個(gè)類型必須實(shí)現(xiàn) IMultiItem 接口,并在getItemType()函數(shù)中返回當(dāng)前item對(duì)應(yīng)的type
public class MultiPageLoadAdapter extends PageLoadMultiRecyclerViewAdapter<MultiData, BaseViewHolder> {
public MultiPageLoadAdapter(List<MultiData> dataList) {
super(dataList);
//構(gòu)造函數(shù)里面將 每種type 和 type 對(duì)應(yīng)的布局進(jìn)行綁定
addItemLayout(MultiData.TYPE_TEXT, R.layout.item_simple);
addItemLayout(MultiData.TYPE_IMAGE, R.layout.item_multi_image);
addItemLayout(MultiData.TYPE_VIDEO, R.layout.item_multi_video);
}
@Override
protected void convert(BaseViewHolder holder, MultiData item) {
//在convert中針對(duì)不同的type 進(jìn)行不同的bind邏輯
switch (holder.getItemViewType()){
case MultiData.TYPE_VIDEO:
holder.setText(R.id.text, item.content);
break;
case MultiData.TYPE_IMAGE:
holder.setText(R.id.text, item.content);
break;
case MultiData.TYPE_TEXT:
holder.setText(R.id.text, item.content);
default:
break;
}
}
}
引入方式也和上面兩種方式一樣
RecyclerView recyclerView = findViewById(R.id.rv);
mAdapter = new MultiPageLoadAdapter(null);
mAdapter.setLoadMoreView(new CommonLoadMoreView());
mAdapter.setOnLoadMoreListener(this);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(mAdapter);
總結(jié)
到此這篇關(guān)于Android端代碼量非常小的分頁加載庫的文章就介紹到這了,更多相關(guān)Android分頁加載庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- android九宮格可分頁加載控件使用詳解
- Android編程實(shí)現(xiàn)分頁加載ListView功能示例
- Android中ListView分頁加載數(shù)據(jù)功能實(shí)現(xiàn)
- Android基于ListView實(shí)現(xiàn)類似Market分頁加載效果示例
- Android之ListView分頁加載數(shù)據(jù)功能實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)基于滑動(dòng)的SQLite數(shù)據(jù)分頁加載技術(shù)(附demo源碼下載)
- Android應(yīng)用中ListView利用OnScrollListener分頁加載數(shù)據(jù)
- Android中ListView如何分頁加載數(shù)據(jù)
- Android實(shí)現(xiàn)ListView分頁加載數(shù)據(jù)
相關(guān)文章
Android應(yīng)用借助LinearLayout實(shí)現(xiàn)垂直水平居中布局
這篇文章主要介紹了Android應(yīng)用借助LinearLayout實(shí)現(xiàn)垂直水平居中布局的方法,文中列舉了LinearLayout線性布局下居中相關(guān)的幾個(gè)重要參數(shù),需要的朋友可以參考下2016-04-04
Android檢測(cè)url地址是否可達(dá)的兩種方法
今天小編就為大家分享一篇Android檢測(cè)url地址是否可達(dá)的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Android動(dòng)畫系列之幀動(dòng)畫和補(bǔ)間動(dòng)畫的示例代碼
Android 提供三種動(dòng)畫:幀動(dòng)畫、補(bǔ)間動(dòng)畫和屬性動(dòng)畫,本篇文章介紹幀動(dòng)畫以及補(bǔ)間動(dòng)畫的使用,屬性動(dòng)畫的使用將在后面的文章中分享,那就來復(fù)習(xí)一下這兩種動(dòng)畫的使用吧2020-09-09
Android實(shí)現(xiàn)收到新短信后自動(dòng)發(fā)郵件功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)收到新短信后自動(dòng)發(fā)郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
android?studio實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器
這篇文章主要為大家詳細(xì)介紹了android?studio實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android實(shí)現(xiàn)網(wǎng)絡(luò)加載圖片點(diǎn)擊大圖后瀏覽可縮放
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)加載圖片點(diǎn)擊大圖后瀏覽可縮放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Kotlin Extension Function擴(kuò)展函數(shù)詳細(xì)介紹
Kotlin支持使用新功能擴(kuò)展類的能力,而無需通過類實(shí)現(xiàn)繼承概念或使用設(shè)計(jì)模式,如裝飾器(Decorator)。這是通過稱為擴(kuò)展功能(Extension Function)的特殊方式來完成的。因此,此功能可以有效地使代碼變得更清晰和易于閱讀,并且還可以減少代碼2023-02-02
用Android?studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了用Android?studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
android暫?;蛲V蛊渌魳凡シ牌鞯牟シ艑?shí)現(xiàn)代碼
來自android自帶的music源碼,下面是廣播接收的代碼,通過發(fā)送廣播來控制音樂的播放,停止等2013-11-11

