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