1. 介绍

主要功能:大数据的分页加载。
主要由三个部分组成:DataSource(数据源)、PageList(分页列表数据的容器)、PageListAdapter(是RecyclerView.Adapter的实现)。

2. 官方api

https://developer.android.google.cn/jetpack/androidx/releases/paging

依赖

dependencies {implementation "androidx.paging:paging-runtime:2.1.2" testImplementation "androidx.paging:paging-common:2.1.2" implementation "androidx.paging:paging-rxjava2:2.1.2"
}

3. DataSource

3.1. DataSource<Key, Value>

PagedList加载的数据来自于DataSource。
有3个子类

  1. ItemKeyedDataSource<Key, Value>:从项目中使用的数据N-1来加载项 N,如从名称排序的数据库查询中查询下一个用户则需要前一个的名称和唯一ID。
  2. PageKeyedDataSource<Key, Value>:加载页面有相邻页的(key)来加载数据例如上一页、下一页。
  3. PositionalDataSource:在任意页面位置加载固定数量的数据。

3.2. DataSource.Factory<Key, Value>

DataSource的实现类需要通过Factory的方式去创建。

  1. 创建实体类

    public class F2DataBean {public String id;public String fraction;public ArrayList<Entry> data;
    }
    
  2. 后台线程的数据

    private List<F2DataBean > loadData(string id, String fraction) {List<F2DataBean> list = new ArrayList();for (int i = 0; i < 100; i++) {F2DataBean data = new F2DataBean();data.phone = id + i;data.fraction= "测试的内容=" + data.id;list.add(data);}return list;
    }
    
  3. 新加载数据时DataSource.Factory会再次创建一个新的DataSource提供实体类格式的新数据提供给PagedList

    public class F2DataSourceFactory extends F2DataSource.Factory<Integer, F2DataBean>{@Overridepublic F2DataSource<Integer,F2DataBean> create() {return new F2DataSource<>();}
    }
    

3.3. ItemKeyedDataSource<Key, Value>

public class F2DataSource<I extends Number,F> extends ItemKeyedDataSource<Integer,F2DataBean> {@Overridepublic void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<F2DataBean> callback) {// 加载初始数据。//LoadParams:加载参数,包括加载后的密钥和请求的大小。callback.onResult(loadData("", 10),0,10);}@Overridepublic void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<F2DataBean> callback) {//在中指定的键之后加载列表数据LoadParams.key。  callback.onResult(loadData(params.key,params.requestedLoadSize));}@Overridepublic void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<F2DataBean> callback) {//在中指定的键之前加载列表数据LoadParams.key。}@NonNull@Overridepublic Integer getKey(@NonNull F2DataBean item) {//返回与给定项目关联的键。return Integer.parseInt(item.phone);}
}

3.4. PageKeyedDataSource<Key, Value>

public class F2DataSource<I extends Number,F> extends PageKeyedDataSource<Integer,F2DataBean> {@Overridepublic void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, F2DataBean> callback) {// LoadParams:负载参数,包括新页面的键和请求的负载大小。// LoadCallback:接收已加载数据的回调。callback.onResult(loadData(0, 10),0,10);}@Overridepublic void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, F2DataBean> callback) {}@Overridepublic void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, F2DataBean> callback) {callback.onResult(loadData(params.startPosition, 10));}
}

3.5. PositionalDataSource

public class F2DataSource2<I extends Number,F> extends PositionalDataSource<F2DataBean> {
private int computeCount() {// actual count code here}private List<Item> loadRangeInternal(int startPosition, int loadCount) {// actual load code here}   @Overridepublic void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<F2DataBean> callback) {//参数传递给,包括页面大小和请求的start /// callback.onResult(loadRangeInternal(position,loadSize),position,totalCount);}@Overridepublic void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<F2DataBean> callback) {
//callback.onResult(loadRangeInternal(params.startPosition,params.loadSize));}
}

4. PagedList

PagedList是一种List,分页加载数据DataSource

//分页设置PagedList.Config config = new PagedList.Config.Builder().setPageSize(10)                         //页面大小即每次加载时加载的数量.setEnablePlaceholders(false)     //配置是否启动PlaceHolders.setInitialLoadSizeHint(10)              //初始化加载的数量.build();

5. PageListAdapter

1.getCurrentList()返回适配器当前正在显示的PagedList。
2.getItemCount()返回适配器持有的数据集中的项目总数。
3.onCurrentListChanged(PagedList currentList)不建议使用此方法。请改用两个参数变体onCurrentListChanged(PagedList, PagedList)
4.onCurrentListChanged(PagedList previousList,PagedList currentList)在当前的PagedList更新时调用。
5.submitList(PagedList pagedList, Runnable commitCallback)设置要显示的新列表。
6.submitList(PagedList pagedList)设置要显示的新列表。
7.getItem(int position)获得项目id

//自定义ViewModel
F2PagingAdapter f2dapter = new F2PagingAdapter();
LivePagedListBuilder liveData = new LivePagedListBuilder(new F2DataSourceFactory(), config).build();
liveData.observe(this, new Observer<PagedList<F2DataBean>>() {@Overridepublic void onChanged(@Nullable PagedList<F2DataBean> dataBeans) {f2dapter.submitList(dataBeans);//刷新也可以用这个添加新数据}});RecyclerView mRecyclerView = view.findViewById(R.id.f2layout2);LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());mRecyclerView.setLayoutManager(mLayoutManager);mRecyclerView.setAdapter(f2dapter);

Android Paging (Java)相关推荐

  1. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  2. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/725.html ☞ ...

  3. 从 Android 到 Java:如何从不同视角解决问题?

    简介:Android 转 Java 开发在技术栈上有哪些差异?思考和解决问题时又会有怎样的转变?本文分享阿里技术专家从 Android 开发转 Java 应用开发的心得感受,分析两者差异及在动态性.兼 ...

  4. android 解决java.nio.BufferOverflowException 异常

    昨天,测试程序时,发现程序了java.nio.BufferOverflowException 异常,后来,在网上搜索了资料,终于解决了问题.这里记录一下. ByteBuffer params = By ...

  5. Android 兼容 Java 8 语法特性的原理分析

    本文主要阐述了Lambda表达式及其底层实现(invokedynamic指令)的原理.Android第三方插件RetroLambda对其的支持过程.Android官方最新的dex编译器D8对其的编译支 ...

  6. 从Android到Java:如何从不同视角解决问题?

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 阿里妹导读:Android 转 Java 开发在技术栈上有哪些差异?思考和解决问题时又会有怎样的转 ...

  7. js调用android本地java代码

    js调用android本地java代码 当在Android上使用WebView控件开发一个Web应用时,可以创建一个通过Javascript调用Android端java代码的接口.也就是可以通过Jav ...

  8. ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法

     ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法 java.lang.NoClassDe ...

  9. android js交互 数组,Android WebView —— Java 与 JavaScript 交互总结

    相比于 Native App 和 Web App,Hybrid App 凭借其迭代灵活.控制自如.多端同步的优势在应用市场上越发显得优胜,主要得力于,其将变更频繁的部分产品功能使用 H5 开发并在客户 ...

最新文章

  1. ORACLE ORA-01653: unable to extend table 的错误
  2. 机器人视觉——使用numpy进行像素的处理 || 获取图像的属性 || 感兴趣区域ROI || 通道的拆分与合并
  3. sklearn朴素贝叶斯分类器_朴素贝叶斯原理
  4. 中国科学院大学2014年数学分析高等代数考研试题
  5. kafka丢数据问题方案(转载+整理+汇总)
  6. E. Jamie and Tree(树链剖分 + 线段树)
  7. [html] html5的Notification桌面通知如何请求权限?
  8. Java-Type简单分类
  9. 6.3.2线索二叉树
  10. oracle性能优化求生指南_oracle性能优化:高水位线(HWM)详解--如何计算HWM
  11. 解读Linux命令格式
  12. BlackBerry 应用程序开发者指南 第二卷:高级--第4章 增加设备选项
  13. Java应用怎么打包发布_myeclipse中java应用程序打包发布步骤
  14. 首次安装pytorch--实测可用
  15. 京瓷打印机m5521cdn_京瓷M5521cdn打印机驱动(京瓷打印机驱动程序)V5.1.2107 最新版...
  16. 国二c语言编程题只看结果吗,全国计算机二级C语言上机考试运行和编译都可以,但是运行出的结果和题目要求的结果不一样...
  17. 几个互联网项目管理软件
  18. Go优雅的重启服务之endless库
  19. upstream指令参数 max_fails、fail_timeout、backup、max_conns、down
  20. Ubuntu (20.4,最新版)安装及简单入门操作

热门文章

  1. 第二学期开学典礼致辞
  2. python3时间格式化
  3. python遍历数组的方法小结
  4. install package vif包_Nexus上传自己本地jar包 和下载maven中央仓库里的包到nexus - 剑器近丶...
  5. 【Python_PyQtGraph 学习笔记(二)】基于PySide2和GraphicsLayoutWidget实现动态绘制数据曲线
  6. 画中画视频编辑软件有哪些?我们如何制作视频画中画?
  7. 【TreeMap】-根据 key 或 value 排序
  8. Windows 常见文件扩展名和说明
  9. 在Linux(centos)中使用k380无线键盘
  10. 中南海保镖--李连杰 主演