亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android端代碼量非常小的分頁加載庫

 更新時(shí)間:2021年03月28日 15:01:33   作者:maxcion  
這篇文章主要給大家介紹了關(guān)于Android端代碼量非常小的分頁加載庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論