废话不多说上代码

package com.mgo.basemodule.common.manager.paging;import android.annotation.SuppressLint;import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;import com.mgo.logimpl.MyLog;import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;import io.reactivex.Flowable;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;/*** @package com.mgo.mainmodule.viewmodel2* @user by lvyaodong* @date 2020/8/27* @email 1126220529@qq.com*/
public class Paging<T extends PagingDataBase, D> {private static final String TAG = "Paging";private Scheduler mLoopScheduler;//发射数据private MutableLiveData<List<D>> postValue = new MutableLiveData<>();//数据转换private Converter<T, D> converter;//页面切换监听private OnPageChangerListener mOnPageChangerListener;//每页多少个数据private int SIZE = -1;//数据private List<T> mData;//总共有几页private int mPageCount = 0;//当前位于第几页private int mCurPage = 0;//总的数据大小private int mDataSize = 0;//多长时间发射一次数据 这个先不实现 先交给外部private long mChangeTime = 10 * 1000;private Disposable mSubscribe;private Paging() {mLoopScheduler = Schedulers.from(Executors.newFixedThreadPool(2));}public Paging(Converter<T, D> converter, int SIZE) {this();this.converter = converter;this.SIZE = SIZE;}public int getPageCount() {return mPageCount;}public int getCurPage() {return mCurPage;}public void setChangeTime(long mChangeTime) {this.mChangeTime = mChangeTime;}public void setSize(int size) {this.SIZE = size;}public void setConverter(Converter<T, D> converter) {this.converter = converter;}public void setOnPageChangerListener(OnPageChangerListener mOnPageChangerListener) {this.mOnPageChangerListener = mOnPageChangerListener;}public void setDataSource(List<T> data) {if (SIZE <= 0) {MyLog.d(TAG, "You should set SIZE first");return;}if (converter == null) {MyLog.d(TAG, "You should set data converter first");return;}this.mData = data;this.mCurPage = 0;this.mDataSize = 0;this.mPageCount = 0;loadData(data);}public LiveData<List<D>> getPostValue() {return postValue;}/*** 可循环下一页** @return 返回是否为最后一页*/public boolean nextPageWithLoop() {if (nextPage()) {MyLog.d(TAG, "Start from first page!");firstPage();return true;}return false;}/*** 不可循环下一页** @return*/public boolean nextPage() {MyLog.d(TAG, "Try execute next page.");if (mPageCount == 0) {MyLog.d(TAG, "No data,no page!");return true;}if (mCurPage >= mPageCount - 1) {MyLog.d(TAG, "It's already the last page.");return true;}int start = (++mCurPage) * SIZE;int end = Math.min((mCurPage + 1) * SIZE, mDataSize);MyLog.d(TAG, "Execute next page success. start: " + start + "--> end: " + end + ", curPage: " + mCurPage);postPageChange(start, end);if (mOnPageChangerListener != null) {mOnPageChangerListener.onPageChange(mCurPage);}return false;}/*** 上一页*/public void prePage() {MyLog.d(TAG, "Try execute pre page.");if (mPageCount == 0) {MyLog.d(TAG, "No data,no page!");return;}if (mCurPage <= 0) {MyLog.d(TAG, "It's already the first page.");return;}int end = Math.min(mCurPage * SIZE, mDataSize);int start = (--mCurPage) * SIZE;MyLog.d(TAG, "Execute pre page success. start: " + start + "--> end: " + end + ", curPage: " + mCurPage);postPageChange(start, end);if (mOnPageChangerListener != null) {mOnPageChangerListener.onPageChange(mCurPage);}}@SuppressLint("DefaultLocale")public void skipToSomePage(int page) {MyLog.d(TAG, String.format("Try skip to '%d' page.", page));if (mPageCount == 0) {MyLog.d(TAG, "No data,no page!");return;}if (page > mPageCount - 1 || page < 0) {MyLog.d(TAG, String.format("No '%d' page! Please re-skip! Page should be 0<=page<=mPageCount - 1", page));return;}mCurPage = page;int start = mCurPage * SIZE;int end = (mCurPage + 1) * SIZE;// 不能使用++mCurPage,否则改变了当前页面end = Math.min(end, mDataSize);MyLog.d(TAG, "Execute next page success. start: " + start + "--> end: " + end + ", curPage: " + mCurPage);postPageChange(start, end);if (mOnPageChangerListener != null) {mOnPageChangerListener.onPageChange(mCurPage);}}public void startLoop() {if (mChangeTime <= 0) {MyLog.d("Please set time first!");return;}cancelLoop();mSubscribe = Flowable.interval(mChangeTime, mChangeTime, TimeUnit.MILLISECONDS).subscribeOn(mLoopScheduler).observeOn(AndroidSchedulers.mainThread()).subscribe(aLong -> nextPageWithLoop());}public void cancelLoop() {dispose(mSubscribe);}private void loadData(List<T> data) {if (data == null || data.size() <= 0) {MyLog.d(TAG, "no data source!");return;}//计算数据量mDataSize = data.size();//页数int page = mDataSize / SIZE;MyLog.d(TAG, "page:" + page);if (mDataSize % SIZE == 0) {this.mPageCount = page;} else {this.mPageCount = page + 1;}MyLog.d(TAG, "PageCount:" + mPageCount);//为每个数据添加具体数据位置for (int i = 0; i < mDataSize; i++) {data.get(i).setPagItemIndex(i);}if (mOnPageChangerListener != null) {mOnPageChangerListener.pagingInitDone(mPageCount);}//发射第一页数据firstPage();}private void firstPage() {if (mPageCount == 0) {MyLog.d(TAG, "FirstPage PageCount:" + mPageCount);return;}if (converter == null) {MyLog.d(TAG, "You should set data converter first");return;}MyLog.d(TAG, "Post first page datas!");mCurPage = 0;postValue.postValue(converter.convertData(mData.subList(0, Math.min(mDataSize, SIZE))));if (mOnPageChangerListener != null) {mOnPageChangerListener.onPageChange(mCurPage);}}private void postPageChange(int pageNum, int size) {if (converter == null) {MyLog.d(TAG, "You should set data converter first");return;}postValue.postValue(converter.convertData(mData.subList(pageNum, size)));}public interface Converter<T, D> {List<D> convertData(List<T> data);}public interface OnPageChangerListener {void onPageChange(int curPage);void pagingInitDone(int pageCount);}private void dispose(Disposable disposable) {if (disposable != null && !disposable.isDisposed()) {disposable.dispose();}}}public class PagingDataBase implements Serializable {private int pagItemIndex;public int getPagItemIndex() {return pagItemIndex;}public void setPagItemIndex(int pagItemIndex) {this.pagItemIndex = pagItemIndex;}
}

其实就是将数据源传入,自己处理数据然后借助LiveData把数据发射出去。内部用RxJava实现了自动翻页处理,如果能实现一个LifeCycle实现自动销毁自动翻页,就更好了。

考虑后期优化:

  • 增加LifeCycle,自动销毁自动轮播
  • 去除RxJava重依赖
  • 完善页面翻页方法
    使用:

1、初始化

//两个泛型第一个是传入的数据,第二个是你要转成的数据,这个地方主要是为了能够直接拿到想要的数据,实现Converter数据转换的方法
//第二个参数是要分页的个数 也就是4个一页
Paging<T,D> mPaging = new Paging<>((Paging.Converter<T, D>) data -> data, 4);

2、配置数据

//设置数据后自动发射第一页数据 如果不符合你的需求可以自己去修改源码
mPaging.setDataSource(data);

3、下一页上一页数据

//下一页数据
mPaging.nextPage()
//上一页数据
mPaging.prePage()

4.下一页数据,自动循环(如果当前页是最后一页下一页没有数据则从头开始发射第一页数据)

//下一页数据
mPaging.nextPageWithLoop()

5.跳到某一页

//已测试通过
mPaging.skipToSomePage(int page)

6.数据监听

mPaging.getPostValue().observe(this, entWxAppBeans -> {//收到数据});

7.页面初始化,页面翻页监听

mPaging.setOnPageChangerListener(new Paging.OnPageChangerListener() {@Overridepublic void onPageChange(int curPage) {MyLog.d(TAG, String.format("Page change to %s.", curPage));//翻页监听}@Overridepublic void pagingInitDone(int pageCount) {//数据加载完成,页面总数回调}});

自定义Paging分页相关推荐

  1. 给DataList分页有两个办法:1、自定义实现分页方法 2、用第三方控件(例如AspNetPager)

    给DataList分页有两个办法:1.自定义实现分页方法 2.用第三方控件(例如AspNetPager) 先介绍下如何自定义实现分页方法. 我的DataList分页方法的核心原理是利用PagedDat ...

  2. Mybatis自定义轻量级分页组件(易集成,易拓展)

    Mybatis自定义轻量级分页组件(易集成,易拓展) 其实github有一个叫做PageHelper的开源分页组件,我也用过,封装的还可以.只是感觉他的量级偏重,其实很多参数,都是我们开发中不需要的参 ...

  3. Lind.DDD.Paging分页模块介绍

    分页组件网上有很多,MVC.Pager,JSPager等,通过实现方式大体分为前端分页和后端分页,前端分页是前台对list内存本地集合进行分页,缺点就是在大数据情况下,内存占用过高:后端分页就是UI把 ...

  4. Spring JPA自定义SQL分页查询

    JPA自定义SQL分页查询 [存在的问题] 在使用Spring JPA原生SQL进行分页查询时存在如下问题: 1.使用List转Page工具类导致查询速度较慢,原因在于先把所有数据查询出来返回成Lis ...

  5. html tabcontrol模板,自定义TabControl 分页标题样式

    首先设置DrawMode 属性 tabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; tabControl.Dr ...

  6. [JAVA EE] JPA 查询用法:自定义查询,分页查询

    项目已上传:https://codechina.csdn.net/qq_36286039/javaee 自定义查询 问题:内置的crud功能不满足需求时如何添加自定义查询? 几种自定义查询方法 方法命 ...

  7. 自定义GridView分页模板

    GridView较之DataGrid提供了更加强大.更加完善的功能,而且具备了丰富的可扩展功能,可以使用GridView提供的pagertemplate自定义分页模板: 事实上,GridView默认的 ...

  8. springboot多数据源动态切换和自定义mybatis分页插件

    1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.d ...

  9. 深入理解Android Paging分页加载库

    来新公司半年多,最近一直在参与 Andorid 团队的架构升级工作.最近在图片选择库中使用了 paging 作为分页加载框架.顺便阅读了一下paging的源码.在这里记录一下. 初次接除 paging ...

最新文章

  1. [LUOGU] 1090 合并果子
  2. C++初学基础知识——注释、变量、基本数据类型
  3. 深入浅出线性判别分析(LDA),从理论到代码实现
  4. 管理服务器一般的作用,管理服务器作用
  5. php如何按降序,PHP数组如何按键名实现降序排列
  6. 2016030207 - sql50题练习(脚本)
  7. Android 系统(70)---Android刘海屏适配方案
  8. Spark on yarn 动态资源配置
  9. 下载hibernate4的jar包
  10. 大学计算机vb基础知识6,西华师范大学计算机VB试题及答案6
  11. Echarts 柱状图设置颜色
  12. 详解GAMIT/GLOBK软件使用
  13. 机器学习——聚类算法(一)
  14. ZT ---- 给孩子的信(孩子写给爸爸妈妈的信在24、25、26楼)
  15. 阿里图标字体库的动态使用Android
  16. k-means用于图像的颜色聚类
  17. 欧科进销存2013V2(超市收银软件支持国外IVA/REQ)绿色免费体积小
  18. 无线网桥有服务器吗,无线网桥的三种用法
  19. Athentech Perfectly Clear Complete 3.6.3汉化版|一键智能清晰磨皮插件
  20. ES6-Generator

热门文章

  1. 集成电路中的低功耗设计(一)
  2. 一文带你怼明白进程和线程通信原理
  3. php+mysql 留言板系统 学生适用
  4. 仿百度搜索html,仿百度搜索智能提示(纯JS实现)
  5. jquery实现曲线运动
  6. idea 到阿伯快捷键_阿伯泰邓迪大学
  7. Windows10系统保留正版系统重装 与 热迁移系统
  8. 【学习笔记】IGMP snooping原理
  9. MFC的exe文件图标更改后依然显示原图标--WINDOWS系统图标缓存未清除或者重建造成的
  10. infiniband学习总结