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利用Sensor(傳感器)實(shí)現(xiàn)水平儀功能
這篇文章主要為大家詳細(xì)介紹了Android利用Sensor傳感器實(shí)現(xiàn)水平儀功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02android studio安裝時(shí) AVD出現(xiàn)問題如何快速解決
這篇文章主要介紹了安裝android studio時(shí) AVD出現(xiàn)問題如何快速處理,其實(shí)解決方法也很簡(jiǎn)單,文中通過截圖的形式給大家及時(shí)的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Android 解決嵌套Fragment無法接收onCreateOptionsMenu事件的問題
本文主要介紹Android Fragment無法接收onCreateOptionsMenu事件的問題,這里給出解決辦法以及詳細(xì)代碼,希望能幫助有需要的小伙伴2016-07-07Arduino 數(shù)據(jù)類型轉(zhuǎn)換(單機(jī)片)詳細(xì)介紹
這篇文章主要介紹了Arduino 數(shù)據(jù)類型轉(zhuǎn)換(單機(jī)片)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11不允許錯(cuò)過的Anndroid技術(shù)經(jīng)驗(yàn)60條
不允許錯(cuò)過的Anndroid技術(shù)經(jīng)驗(yàn)60條,與大家分享,希望可以提高大家Android開發(fā)水平,感興趣的朋友可以參考一下2016-02-02android中webview控件和javascript交互實(shí)例
這篇文章主要介紹了android中webview控件和javascript交互實(shí)例,例子中包括javascript調(diào)用java的方法,java代碼中調(diào)用javascript的方法,需要的朋友可以參考下2014-07-07Android自定義Dialog實(shí)現(xiàn)通用圓角對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android自定義Dialog實(shí)現(xiàn)通用圓角對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11