Paging#
用途#
对数据按需加载,实现无限滚动,支持从本地存储和网络加载。
优势#
- 支持与Jetpack包下的库组合使用
- 支持第三方库 RxJava
基本用法#
增加依赖#
1 | // paging |
常见API#
使用Paging库进行分页加载时,需要用到几个核心的类,分别是PagedListAdapter、PageList和DataSource。
API | 用途 |
---|---|
PagedListAdapter | RecyclerView的适配器,扩展了原生的差分更新功能 |
PagedList | 数据结构集合,存储DataSource 中分页不变的内容列表,按条件获取数据 |
DataSource | 加载数据至PagedList |
DataSource.Factory | 创建DataSrouce |
LivePagedListBuilder | 设置分页加载的配置项,设置DataSource.Factory ,设置DataSource ,返回LiveData |
LoadParams |
加载的关键信息,包括加载的键,和加载的页数 |
LoadResult |
加载成功返回LoadResult.Page ,加载失败返回LoadResult.Error |
PagedListAdapter#
众所周知,在Android
列表开发中需要使用RecyclerView
,并且需要配合自定义Adapter
。PagedListAdapter
继承于RecyclerView.Adapter,这表明它也是一个RecyclerView.Adapter
,并且扩展了RecyclerView.Adapter
的支持异步差分更新功能,该功能依赖于匿名内部类 DiffUtil.ItemCallback<T>
,使用时必须复写areItemsTheSame
、areContentsTheSame
方法。
PageList#
PageList
是用于通知DataSource
何时获取数据,以及如何获取数据。比如,何时获取第一页数据,以及何时开始加载数据等待。并且,DataSource
数据源都将通过PageList
设置给PagedListAdapter
。
LivePagedListBuilder
设置分页加载的配置项,通过传入DataSource.Factory
,在Factory
的create
方法里,返回DataSource
,返回Adapter
可以使用的LiveData
,并通知页面,将新数据刷新到布局上;通过传入PagedList.Config
设置分页参数如pageSize
、prefetchDistance
等
DataSource#
DataSource主要用于执行数据的加载操作,数据载入操作必须在子线程中进行,否则会造成主线程的阻塞。DataSource的来源可以是网路,也可以是本地的数据库,如Room。根据分页机制的不同,DataSource可以有3种来源,分别是PageKeyedDataSource、PositionalDataSource和ItemKeyedDataSource。
- PageKeyedDataSource:根据传入的页面num获取某一页的数据,比如获取第2页的数据。
- PositionalDataSource:分页时默认显示的第几页。
- ItemKeyedDataSource:封装了上一页、下一页的能力
Demo设计#
好文章推荐阅读https://juejin.cn/post/6844903976777809928#heading-24
Paging加载更多的机制#
如何找刷新的位置?
1 | PagedList#BoundaryCallback |
PagedList
刷新位置1:
1 |
|
PagedList
刷新位置2
1 | /* synthetic access */ |