Android端代碼量非常小的分頁加載庫
前言
RecyclerView幾乎在每個app裡面都有被使用,但凡使用瞭列表就會采用分頁加載進行數據請求和加載。android 官方也推出瞭分頁庫,但是感覺隻有kotlin一起使用才能體會到酸爽。Java 版本的也有很多很強大的第三方庫,
BaseRecyclerViewAdapterHelper這個庫是我用起來最順手的分頁庫,裡面也包含瞭各式各樣強大的功能:分組、拖動排序、動畫,因為功能強大,代碼量也相對比較大。 但是很多時候我們想要的就是分頁加載,所以參照BaseRecyclerViewAdapterHelper寫下瞭這個分頁加載庫,隻有分頁功能。(可以說照搬,也可以說精簡,但是其中也加入個人理解)。
這個庫相對BaseRecyclerViewAdapterHelper隻有兩個優點:
- 代碼量小
- BaseRecyclerViewAdapterHelper 在數據不滿一屏時仍然顯示加載更多以及頁面初始化時都會顯示loadmoewView(雖然提供瞭api進行隱藏,但是看瞭很長時間註釋和文檔都沒瞭解該怎麼使用),而這個庫在初次加載和不滿一屏數據時不會顯示loadmoreView
gradle引用
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);
RecyclerView多Type支持
如果要使用多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端代碼量非常小的分頁加載庫的文章就介紹到這瞭,更多相關Android分頁加載庫內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- None Found