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分页加载库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Recyclerview实现水平分页GridView效果示例

    昨天UI妹子给了给需求,展示水平分页效果,而且第二页要默认显示一部分,提示用户水平可以滑动,先上效果图: 很明显横向滑动的分页,第一反应就是使用ViewPager,毕竟只要通过自定义ViewPager,实现这个效果还是很容易,但是实际中问题时,当前模块是Recyclerview中某一个Holder,为了性能,肯定尽量使用Recyclerview去复用View,而且ViewPager并不能复用,所以考虑之后,还是要用Recyclerview去实现. 解决思路 既然打算用Recyclerview实现

  • Android中RecyclerView实现分页滚动的方法详解

    一.需求分析 最近公司项目要实现一个需求要满足以下功能: 1)显示一个 list 列表, item 数量不固定. 2)实现翻页功能,一次翻一页. 3)实现翻至某一页功能. 下面介绍通过 RecyclerView 实现该需求的实现过程(效果图如下). 二.功能实现 2.1 OnTouchListener 记录当前开始滑动位置 要实现翻页滑动首先我们要确定是向前翻页还是向后翻页,这里通过记录开始翻页前当前的位置和滑动后的位置比较即可得知,下面选择手指触摸按下时滑动的位置为当前开始滑动位置: //当前

  • Android实现简单的分页效果

    本文实例为大家分享了Android分页效果的具体代码,供大家参考,具体内容如下 1.实现分页最主要的就是封装分页代码,然后在按钮里实现相关的操作 /** * 分页工具 * * @Project App_Page * @Package com.android.dividepage * @author chenlin * @version 1.0 * @Date 2012年6月2日 * @Note TODO * @param <T> */ public class PageHelper<T&

  • Android实现ListView分页自动加载数据的方法

    Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验.因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据. 下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListVie

  • Android之ListView分页加载数据功能实现代码

    什么是ListView分页加载数据功能呢?在现在的大数据时代,我们不可能把某些数据全部展示到界面,好比我们经常会看的QQ空间一样,当你看动态的时候,系统不可能会把所有好友的动态都展示在上面,你能看到的一般都是最新好友更新的动态,假如你要看非最新的好友动态,通常你都会手指向上滑动屏幕然后去查看,当界面下滑到一定数量的时候,就会看到一个"查看更多",然后突然停顿一下,系统会通过网络去给你刷新其他动态信息,这样的功能我们一般叫做数据下拉刷新功能,也就是我们的分页加载功能,具体的实现是怎样的呢

  • Android开发中滑动分页功能实例详解

    本文实例讲述了Android开发中滑动分页功能.分享给大家供大家参考,具体如下: android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: Java代码: package cn.anycall.ju; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import andro

  • android实现listview分页的方法

    本文实例讲述了android实现listview分页的方法.分享给大家供大家参考.具体分析如下: 最近做了下listview的分页,跟WEB上的分页是一个意思,需要那几个分页参数,不同的是sqlite中分页的查询语句,简便的方法需要用Limit,Offset关键字,前者是查询每页展示的记录数,后者是越过多少记录数,说得明白点就是忽略前面多少行记录之后,取多少行记录 我分页采用了一个重要的类Page,通过封装Page类,做为参数传递进来,返回出去也是个Page对象 import java.util

  • Android提高之SQLite分页表格实现方法

    继前一篇文章讲到Android上的SQLite分页读取,其功能只是用文本框显示数据而已.本文就讲得更加深入些,实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据. 先来看看本文程序运行的动画如下图所示: 这个SQL分页表格控件主要分为"表格区"和"分页栏"这两部分,这两部分都是基于GridView实现的.网上介绍Android上实现表格的DEMO一般都用ListView.ListView与GridView对比,ListView最大的优势是格单元的

  • Android中实现多行、水平滚动的分页的Gridview实例源码

    功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以fling函数中自己

  • Android端代码量非常小的分页加载库

    前言 RecyclerView几乎在每个app里面都有被使用,但凡使用了列表就会采用分页加载进行数据请求和加载.android 官方也推出了分页库,但是感觉只有kotlin一起使用才能体会到酸爽.Java 版本的也有很多很强大的第三方库, BaseRecyclerViewAdapterHelper这个库是我用起来最顺手的分页库,里面也包含了各式各样强大的功能:分组.拖动排序.动画,因为功能强大,代码量也相对比较大. 但是很多时候我们想要的就是分页加载,所以参照BaseRecyclerViewAd

  • 微信小程序分页加载的实例代码

    整理文档,搜刮出一个微信小程序分页加载的代码,稍微整理精简一下做下分享. 分页加载功能大家遇到的应该会经常遇到,应用场景也很多,例如微博,QQ,微信朋友圈以及新闻类应用,都会有分页加载的功能,这不仅节省了我们用户的流量,还提升了用户体验.那么今天的这篇文章就是介绍微信小程序中如何实现分页加载的功能.照例先上源码及效果图. 源码传送门 要实现这样的功能,一般需要在请求数据时加入当前请求页数,以及页的大小(每页显示的数量)也有一部分接口是通过请求的开始偏移量和结束偏移量请求数据,例如你一页显示10条

  • Android实现基于滑动的SQLite数据分页加载技术(附demo源码下载)

    本文实例讲述了Android实现基于滑动的SQLite数据分页加载技术.分享给大家供大家参考,具体如下: main.xml如下: <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_settings" android:orderInCategory="100" android:showAs

  • Android性能优化之RecyclerView分页加载组件功能详解

    目录 引言 1 分页加载组件 1.1 功能定制 1.2 手写分页列表 1.3 生命周期管理 2 github 引言 在Android应用中,列表有着举足轻重的地位,几乎所有的应用都有列表的身影,但是对于列表的交互体验一直是一个大问题.在性能比较好的设备上,列表滑动几乎看不出任何卡顿,但是放在低端机上,卡顿会比较明显,而且列表中经常会伴随图片的加载,卡顿会更加严重,因此本章从手写分页加载组件入手,并对列表卡顿做出对应的优化 1 分页加载组件 为什么要分页加载,通常列表数据存储在服务端会超过100条

  • Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多

    最近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多. 新浪微博就是使用这种方式的典型. 当用户从网络上读取微博的时候,如果一下子全部加载用户未读的微博这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了,其实这个分页可以做成客户端的分页,也可以做成服务器端的分页(点击加载时,从服务器对应的加载第N页就好了!!!).通过分

  • Android基于ListView实现类似Market分页加载效果示例

    本文实例讲述了Android基于ListView实现类似Market分页加载效果.分享给大家供大家参考,具体如下: 最近几天研究ListView实现分页加载和滚动加载,发现可以用listView的OnScroll方法来实现,直接上代码 ListViewScroll.java package zy.lucifer.ListViewScroll; import android.app.Activity; import android.os.Bundle; import android.util.Lo

  • 微信小程序实战之上拉(分页加载)效果(2)

    上拉加载(分页加载) 当用户打开一个页面时,假设后台数据量庞大时,一次性地返回所有数据给客户端,页面的打开速度就会有所下降,而且用户只看上面的内容而不需要看后面的内容时,也浪费用户流量,基于优化的角度来考虑,后台不要一次性返回所有数据,当用户有需要再往下翻的时候,再加载更加数据出来. 业务需求: 列表滚动到底部时,继续往上拉,加载更多内容 必备参数: (1)pageindex: 1 //第几次加载 (2)callbackcount: 15 //需要返回数据的个数 其他参数: 根据接口的所需参数

  • android九宫格可分页加载控件使用详解

    本文实例为大家分享了android九宫格可分页加载控件的具体实现代码,供大家参考,具体内容如下 github地址 基本思路是viewpager+gridview,每一页viewpager视图有一个gridview,gridview加载九格.所以要保证数据的准确性.数据以List< List < T>>的形式.控件实现了高度自适应,根据控件的个数,计算控件的高度.内部的viewpager和gridview视图都以动态创建,无需新建一个xml文件,整个控件只需要一个item的布局文件.

  • Android实现ListView分页加载数据

    本文实例为大家分享了ListView分页加载数据的具体代码,供大家参考,具体内容如下 FenyeActivity package com.example.myapplication.fenye; import androidx.appcompat.app.AppCompatActivity; import android.app.ListActivity; import android.os.Bundle; import android.os.Handler; import android.ut

随机推荐