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



單列分頁(yè)加載
//一定要在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)在需要打開(kāi)adapter的分頁(yè)加載功能
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也打開(kāi)了分頁(yè)加載功能,第三部就是根據(jù)接口返回的數(shù)據(jù)判斷到底是 加載失敗了、加成成功了還是加載結(jié)束(沒(méi)有更多數(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){// 接口返回了滿滿一頁(yè)的數(shù)據(jù),這里數(shù)據(jù)加載成功
if (mAdapter.getDataSize() == 0){
//當(dāng)前列表里面沒(méi)有數(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ù)不足一頁(yè),也就代表沒(méi)有足夠的數(shù)據(jù)了,那么也就沒(méi)有下一頁(yè)數(shù)據(jù),所以這里
//認(rèn)定分頁(yè)加載結(jié)束
//這里的參數(shù)也一定要傳true
mAdapter.loadMoreEnd(true);
}
}
@Override
public void onFail() {
mFailCount++;
//請(qǐng)求失敗 通知recyclerview 刷新footview 狀態(tài)
mAdapter.loadMoreFail(true);
}
});
}
上面是我寫(xiě)的模擬接口請(qǐng)求,不用在意其他代碼,只要關(guān)注onSuccess 和onFail 兩個(gè)回調(diào)里面的邏輯。
混合布局的支持
在電商行業(yè)經(jīng)常能看到商品列表中,同一個(gè)列表,有的商品占滿整整一行,有的一行顯示2-3個(gè)商品。這種實(shí)現(xiàn)方案就是通過(guò)GridLayoutManager 的SpanSizeLookup 來(lái)控制每個(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, 在寫(xiě)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端代碼量非常小的分頁(yè)加載庫(kù)的文章就介紹到這了,更多相關(guān)Android分頁(yè)加載庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- android九宮格可分頁(yè)加載控件使用詳解
- Android編程實(shí)現(xiàn)分頁(yè)加載ListView功能示例
- Android中ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn)
- Android基于ListView實(shí)現(xiàn)類似Market分頁(yè)加載效果示例
- Android之ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)基于滑動(dòng)的SQLite數(shù)據(jù)分頁(yè)加載技術(shù)(附demo源碼下載)
- Android應(yīng)用中ListView利用OnScrollListener分頁(yè)加載數(shù)據(jù)
- Android中ListView如何分頁(yè)加載數(shù)據(jù)
- Android實(shí)現(xiàn)ListView分頁(yè)加載數(shù)據(jù)
相關(guān)文章
Android利用Sensor(傳感器)實(shí)現(xiàn)水平儀功能
這篇文章主要為大家詳細(xì)介紹了Android利用Sensor傳感器實(shí)現(xiàn)水平儀功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
android studio安裝時(shí) AVD出現(xiàn)問(wèn)題如何快速解決
這篇文章主要介紹了安裝android studio時(shí) AVD出現(xiàn)問(wèn)題如何快速處理,其實(shí)解決方法也很簡(jiǎn)單,文中通過(guò)截圖的形式給大家及時(shí)的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android 解決嵌套Fragment無(wú)法接收onCreateOptionsMenu事件的問(wèn)題
本文主要介紹Android Fragment無(wú)法接收onCreateOptionsMenu事件的問(wèn)題,這里給出解決辦法以及詳細(xì)代碼,希望能幫助有需要的小伙伴2016-07-07
Arduino 數(shù)據(jù)類型轉(zhuǎn)換(單機(jī)片)詳細(xì)介紹
這篇文章主要介紹了Arduino 數(shù)據(jù)類型轉(zhuǎn)換(單機(jī)片)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11
不允許錯(cuò)過(guò)的Anndroid技術(shù)經(jīng)驗(yàn)60條
不允許錯(cuò)過(guò)的Anndroid技術(shù)經(jīng)驗(yàn)60條,與大家分享,希望可以提高大家Android開(kāi)發(fā)水平,感興趣的朋友可以參考一下2016-02-02
android中webview控件和javascript交互實(shí)例
這篇文章主要介紹了android中webview控件和javascript交互實(shí)例,例子中包括javascript調(diào)用java的方法,java代碼中調(diào)用javascript的方法,需要的朋友可以參考下2014-07-07
Android自定義Dialog實(shí)現(xiàn)通用圓角對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android自定義Dialog實(shí)現(xiàn)通用圓角對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11

