基于Android官方Paging Library的RecyclerView分页加载框架

我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。现在再介绍一种RecyclerView分页加载框架:Android Paging Library。
Android Paging Library是Android官方support-v7支持包中专门做的分页框架,详细文档见谷歌官方文档附录2页面。我写这篇文章时候Paging Library的版本是1.0.0-alpha3。
使用Android Paging Library首先需要在gradle添加引用:

implementation 'android.arch.paging:runtime:1.0.0-alpha3'

下面我写示例代码做一个简单的演示:

package zhangphil.demo;import android.arch.paging.PagedList;
import android.arch.paging.PagedListAdapter;
import android.arch.paging.TiledDataSource;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.recyclerview.extensions.DiffCallback;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;public class MainActivity extends AppCompatActivity {private PagedList<DataBean> mPagedList;private MyDataSource mDataSource;private RecyclerView mRecyclerView;private PagedListAdapter mAdapter;private LinearLayoutManager mLayoutManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mDataSource = new MyDataSource();makePageList();mRecyclerView = findViewById(R.id.recycler_view);mLayoutManager = new LinearLayoutManager(this);mLayoutManager.setOrientation(LinearLayout.VERTICAL);mRecyclerView.setLayoutManager(mLayoutManager);mAdapter = new MyAdapter();mRecyclerView.setAdapter(mAdapter);mAdapter.setList(mPagedList);mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {private int lastPos;@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);lastPos = mLayoutManager.findLastVisibleItemPosition();mPagedList.loadAround(lastPos);//触发Android Paging的加载事务逻辑。}});}private void makePageList() {PagedList.Config mPagedListConfig = new PagedList.Config.Builder().setPageSize(3) //分页数据的数量。在后面的DataSource之loadRange中,count即为每次加载的这个设定值。.setPrefetchDistance(5) //初始化时候,预取数据数量。.setEnablePlaceholders(false).build();mPagedList = new PagedList.Builder().setConfig(mPagedListConfig).setDataSource(mDataSource).setMainThreadExecutor(new BackgroundThreadTask()) //初始化阶段启用.setBackgroundThreadExecutor(new MainThreadTask()) //初始化阶段启动.build();}private class BackgroundThreadTask implements Executor {public BackgroundThreadTask() {this.execute(new Runnable() {@Overridepublic void run() {Log.d("BackgroundThreadTask", "run");}});}@Overridepublic void execute(@NonNull Runnable runnable) {runnable.run();}}private class MainThreadTask implements Executor {public MainThreadTask() {this.execute(new Runnable() {@Overridepublic void run() {Log.d("MainThreadTask", "run");}});}@Overridepublic void execute(@NonNull Runnable runnable) {runnable.run();}}private class MyDataSource extends TiledDataSource<DataBean> {@Overridepublic int countItems() {return TiledDataSource.COUNT_UNDEFINED;}/*** 注意,这里需要后台线程化。** @param startPosition* @param count* @return*/@Overridepublic List<DataBean> loadRange(int startPosition, int count) {Log.d("MyDataSource", "loadRange:" + startPosition + "," + count);List<DataBean> list = loadData(startPosition, count);return list;}}/*** 假设这里需要做一些后台线程的数据加载任务。** @param startPosition* @param count* @return*/private List<DataBean> loadData(int startPosition, int count) {List<DataBean> list = new ArrayList();for (int i = 0; i < count; i++) {DataBean data = new DataBean();data.id = startPosition + i;data.content = "zhangphil@" + data.id;list.add(data);}return list;}private class MyViewHolder extends RecyclerView.ViewHolder {public TextView text1;public TextView text2;public MyViewHolder(View itemView) {super(itemView);text1 = itemView.findViewById(android.R.id.text1);text1.setTextColor(Color.RED);text2 = itemView.findViewById(android.R.id.text2);text2.setTextColor(Color.BLUE);}}private class MyAdapter extends PagedListAdapter<DataBean, MyViewHolder> {public MyAdapter() {super(mDiffCallback);}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(getApplicationContext()).inflate(android.R.layout.simple_list_item_2, null);MyViewHolder holder = new MyViewHolder(view);return holder;}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {DataBean data = mPagedList.get(position);holder.text1.setText(String.valueOf(position));holder.text2.setText(String.valueOf(data.content));}}private DiffCallback<DataBean> mDiffCallback = new DiffCallback<DataBean>() {@Overridepublic boolean areItemsTheSame(@NonNull DataBean oldItem, @NonNull DataBean newItem) {Log.d("DiffCallback", "areItemsTheSame");return oldItem.id == newItem.id;}@Overridepublic boolean areContentsTheSame(@NonNull DataBean oldItem, @NonNull DataBean newItem) {Log.d("DiffCallback", "areContentsTheSame");return TextUtils.equals(oldItem.content, newItem.content);}};private class DataBean {public int id;public String content;}
}

代码实现的功能很简单,当RecyclerView不断下滑时,就触发分页加载,把RecyclerView后续使用的数据分页加载显示出来。暂时我将现阶段对Android Paging Library技术的心得记录下来,作为我学习Android Paging Library技术的阶段性备忘录。这部分代码还有待进一步完善,Android Paging Library技术细节后续会继续跟进研究。

附录:
1,《基于Android官方AsyncListUtil优化改进RecyclerView分页加载机制(一)》链接:http://blog.csdn.net/zhangphil/article/details/78603499 
2,谷歌Android官方Android Paging Library技术文档主页:https://developer.android.google.cn/topic/libraries/architecture/paging.html#classes

基于Android官方Paging Library的RecyclerView分页加载框架相关推荐

  1. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  2. Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据

    Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据 我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页 ...

  3. Android LruCache和DiskLruCache相结合打造图片加载框架(仿微信图片选择,照片墙)

    LrcCache和DiskLruCache相结合打造图片加载框架 转载请标明出处:http://blog.csdn.net/luoshishou/article/details/51299169 源码 ...

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

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

  5. Android网络图片加载框架的选择

    前言 Android发展到今天,已经出现了很多优秀的图片缓存函数库,开发人员可以根据实际需求进行选择,传统的图片缓存方案中设置有两级缓存,分别是内存缓存和磁盘缓存.再Facebook推出的Fresco ...

  6. osgi框架 android,基于OSGi的Android应用模块动态加载框架设计与实现

    摘要: 伴随着移动互联网科技水平向4G的飞跃,移动终端的使用日趋常态化,移动智能设备的普及率越来越高,得到了大量使用者的追捧.与此同时,各手机操作系统下应用商店里正充斥着琳琅满目的移动应用产品,用户对 ...

  7. android 自定义域名,Android基于Retrofit2改造的可设置多域名的网络加载框架

    Android基于Retrofit2改造的可设置多域名的网络加载框架 1.使用说明 添加仓库 ``` allprojects { repositories { google() jcenter() m ...

  8. Android 浏览器内核浅谈,基于WebKit内核的Android手机浏览器的性能研究与加载优化...

    南京邮电大学 硕士 2017 基于WebKit内核的Android手机浏览器的性能研究与加载优化 Performance Research and Load Optimization of Andro ...

  9. Android GridView横向滚动,分页加载数据

    转载请注明出处,谢谢http://blog.csdn.net/harryweasley/article/details/51007348 始终觉得讲ui效果要先放上效果图,要不让其他人好不容易看完了, ...

  10. Android图片加载框架——Glide(Glide v4)

    原文地址 Android图片加载框架--Glide(Glide v4) 前言 android中图片加载框架有很多,所有框架最终达到的目都是在Android平台上以极度简单的方式加载和展示图片,如果我们 ...

最新文章

  1. PCB的EMC设计之PCB叠层结构
  2. ios中tableview网封装(viewcontroller封装)常用的
  3. ubuntu11.04服务器安装
  4. CCS5连接调试C64X系列DSP核
  5. echarts 地图自定义图标_DMKB08:Echarts 分段设色
  6. 官网下载mysql实例数据库
  7. Java String startsWith()方法与示例
  8. php 定时缓存,php定时清理缓存文件的简单示例
  9. c++ char*初始化_[零食时间]C/C++ 字符串全家桶(字符串表示/定义、字符串输入输出、易错点等)上半桶...
  10. shell---登录失败的IP添加到/etc/hosts.deny
  11. linux下的僵尸进程 - Zombie
  12. brother打印机清零步骤_兄弟打印机清零方法兄弟打印机清零方法步骤
  13. c语言小程序:打文字游戏【图形库graphics.h】
  14. CCS 5.5的安装教程
  15. Shiro完整教程, 附带各种配置
  16. Arcgis 安装教程
  17. lamp一键安装包不安装mysql_LAMP一键安装包-CentOS 5/6下自动编译安装Apache,MySQL,PHP...
  18. 电脑能上qq等软件但是浏览器打不开网页
  19. (2022年6月)注册ArcGIS Online(Learn ArcGIS) 21天免费账号笔记
  20. java http 401_401 API请求状态错误

热门文章

  1. ArcGIS Server学习资料
  2. 迭代器模式C++实现
  3. Landsat8数据初识和概述
  4. Python 3 实现选择排序
  5. 实习踩坑之路:快速失败:使用stream流便利集合的时候删除了对象,导致抛错Null
  6. Java设计模式--代理模式与JDK动态代理,cglib动态代理
  7. Flutter之EdgeInsetsGeometry简析
  8. Flink 如何读取和写入 Clickhouse?
  9. 华为奇葩面试题:一头牛重800公斤一座桥承重700公斤,请问牛怎么过桥?
  10. java 代码重排_Java中指令重排