您好,登錄后才能下訂單哦!
這篇文章主要介紹了Android端分頁加載庫的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
RecyclerView幾乎在每個app里面都有被使用,但凡使用了列表就會采用分頁加載進行數據請求和加載。android 官方也推出了分頁庫,但是感覺只有kotlin一起使用才能體會到酸爽。Java 版本的也有很多很強大的第三方庫,
BaseRecyclerViewAdapterHelper這個庫是我用起來最順手的分頁庫,里面也包含了各式各樣強大的功能:分組、拖動排序、動畫,因為功能強大,代碼量也相對比較大。 但是很多時候我們想要的就是分頁加載,所以參照BaseRecyclerViewAdapterHelper寫下了這個分頁加載庫,只有分頁功能。(可以說照搬,也可以說精簡,但是其中也加入個人理解)。
這個庫相對BaseRecyclerViewAdapterHelper只有兩個優點:
代碼量小
BaseRecyclerViewAdapterHelper 在數據不滿一屏時仍然顯示加載更多以及頁面初始化時都會顯示loadmoewView(雖然提供了api進行隱藏,但是看了很長時間注釋和文檔都沒了解該怎么使用),而這個庫在初次加載和不滿一屏數據時不會顯示loadmoreView
implementation 'com.maxcion:pageloadadapter:1.0.0'
項目地址:github.com/Likeyong/Pa…
//一定要在PageLoadRecyclerVewAdapter<String> 的泛型參數里面指定數據源item格式 public class SimpleAdapter extends PageLoadRecyclerVewAdapter<String> { public SimpleAdapter(List<String> dataList) { super(dataList); } //這里進行 數據綁定 @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實現好了,現在需要打開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); //實例化adapter mAdapter = new SimpleAdapter(null); //給adapter 設置loadmoreview mAdapter.setLoadMoreView(new CommonLoadMoreView()); //設置滑動到底部時進行更多加載的回調 mAdapter.setOnLoadMoreListener(this); rv.setAdapter(mAdapter); rv.setLayoutManager(new LinearLayoutManager(this)); request(); } @Override public void onLoadMoreRequested() { request(); } //這個函數不用管 @Override protected List<String> convertRequestData(List<String> originData) { return originData; } }
第二步,RecyclerView也打開了分頁加載功能,第三部就是根據接口返回的數據判斷到底是 加載失敗了、加成成功了還是加載結束(沒有更多數據需要加載)
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){// 接口返回了滿滿一頁的數據,這里數據加載成功 if (mAdapter.getDataSize() == 0){ //當前列表里面沒有數據,代表是初次請求,所以這里使用setNewData() mAdapter.setNewData(finalResult); }else { //列表里面已經有數據了,這里使用addDataList(),將數據添加到列表后面 mAdapter.addDataList(finalResult); } //這里調用adapter。loadMoreComplete(true) 函數通知列表刷新footview, 這里參數一定要傳true mAdapter.loadMoreComplete(true); }else { //如果接口返回的數據不足一頁,也就代表沒有足夠的數據了,那么也就沒有下一頁數據,所以這里 //認定分頁加載結束 //這里的參數也一定要傳true mAdapter.loadMoreEnd(true); } } @Override public void onFail() { mFailCount++; //請求失敗 通知recyclerview 刷新footview 狀態 mAdapter.loadMoreFail(true); } }); }
上面是我寫的模擬接口請求,不用在意其他代碼,只要關注onSuccess 和onFail 兩個回調里面的邏輯。
在電商行業經常能看到商品列表中,同一個列表,有的商品占滿整整一行,有的一行顯示2-3個商品。這種實現方案就是通過GridLayoutManager 的SpanSizeLookup 來控制每個item占幾列的。
RecyclerView rv = findViewById(R.id.rv); mAdapter = new SimpleAdapter(null); mAdapter.setLoadMoreView(new CommonLoadMoreView()); mAdapter.setOnLoadMoreListener(this); //這里我們將列表設置最多兩列 GridLayoutManager layoutManager = new GridLayoutManager(this, 2); layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { //根據position 設置每個item應該占幾列 //如果當前的position是3的整數倍 我們就讓他占滿2列,其他的只占1列 return position % 3 == 0 ? 2 : 1 ; } }); rv.setLayoutManager(layoutManager); rv.setAdapter(mAdapter);
如果要使用多type, 在寫Adapter的時候要繼承PageLoadMultiRecyclerViewAdapter<T, BaseViewHolder>,其中T 是數據源item類型,這個類型必須實現 IMultiItem 接口,并在getItemType()函數中返回當前item對應的type
public class MultiPageLoadAdapter extends PageLoadMultiRecyclerViewAdapter<MultiData, BaseViewHolder> { public MultiPageLoadAdapter(List<MultiData> dataList) { super(dataList); //構造函數里面將 每種type 和 type 對應的布局進行綁定 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中針對不同的type 進行不同的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);
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Android端分頁加載庫的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。