Jetpack 里面的 Paging 和 Room

Jetpack系列:Paging组件帮你解决分页加载实现的痛苦 相信很多小伙伴们在项目实战中,经常会用到界面的分页显示、加载更多等功能。需要针对具体功能做针对性开发和调试,耗时耗力。 Paging组件的使用将这部分的工作简化,从而让开发者更专注于业务的具体实现。下面我们一起来学习下Paging组件的使用方法。 首先来看下使用Paging组件实现的分页加载和刷新效果: 数据库读取分页加载 网络端分页请求数据 下面我们针对这两个使用Paging组... 阅读详情

paging 主要作用就是用来加载列表数据以及加载更多也就是分页加载的,展示还是人家 recyclerview 的事儿,只不过 paging 可以把这个过程变得更加的高效。想想咱们以前加载更多怎么做的,我们需要关注到 recyclerview 或者 listview 通过他们知道用户是不是滑动到页面底部了,是不是该加载更多了,并且还需要我们自己维护加载到第几页,下次该加载哪一页,而现在呢?这一切几乎都不需要我们开发者自己维护,全部都交给 paging 吧。

说到 paging,对它很重要的就是它的数据源,也就是 datasource,而 datasource 一般分为三种,其一是只从网络加载数据,其二是只从本地数据库加载数据,其三是当本地数据库没有数据的时候,先从网络加载,然后缓存到本地数据库,而后再从数据库响应到视图层。

其中估计我们最常用的就是直接从网络加载数据,但是官方的示例是上面我写的其三那种情况,是用 retrofit 处理网络请求,然后用 jetpack 里面的 room 数据库做本地缓存,所以我们还需要了解下这种方式,我们知道 room 数据库的 Dao 层可以直接将数据以 LiveData 包装的形式查询出来,但是 pagelist 需要的是 datasource,所以我们需要将 Dao 层的查询结果返回值改为 DataSource.Factory<Key, Value>,其中的 key 指的是我们的请求参数,例如我们分页加载时候要加载第几页,value 指的是查询出来的可以给视图层直接使用的实体。

但是我们知道视图层的数据是由 viewmodel 管理的,而暴露给数据层又是 LiveData,所以现在我们需要做的是将从数据库查询出来的 datasource 转换为视图层可以使用的 LiveData,这时候我们就需要用到 LivePagedListBuilder 了,这是一个对 pagelist 做配置以及提供数据源的建造者,所以它实例化的时候需要传入两个参数,一个是 datasource,另外一个是关于 pagelist 的 Config,这里传入的 datasource 就是我们从数据库查询出来的那个,而 config 需要我们自己构造,我们可以配置分页加载时候每页加载的条数,可以配置如果数据还没加载完成的时候是否有占位等等,这些配置完成之后,我们直接调用 LivePagedListBuilder 的 build 方法就可以得到一个 LiveData<PagedList<Value>> 实例了。至此我们得到了视图层可以使用的 livedata。

很多人可能会疑问说上面提到的 pagelist 到底是干嘛的呢?它是 pageing 里面的另外一个重要的组件,paging 的分页加载功能也主要是由它实现的,不过本质上它还是一个集合 list,有了数据,我们还需要给 recyclerview 展示所需的 adapter,所以我们要把平时继承 RecyclerView.Adapter 的改为继承 PagedListAdapter,这是一个可以和 pagelist 配合使用的 adapter,这个 adapter 与普通的 adapter 的不同之处还在于它的构造方法还需要一个 DiffUtil.ItemCallback 这是干啥用的呢?

顾名思义就是用来计算不同的,它可以计算出两个 pagelist 之间的不同,然后把那些不同更新到界面上,而不是暴力的将原来的所有数据替换,将整个页面刷新,所以这种 diff 操作能够减少资源的消耗。但是这个不同是怎么定义的呢?还是需要我们业务来定义,所以我们需要实现 ItemCallback 这个抽象类里面的 areItemsTheSame 和 areContentsTheSame 方法,前者用来定义我们用 pagelist 里面的哪个属性来判断两个 item 是否相同,而后者是直接用两个 item 的内存地址来判断是否相同。

以上就是 PagedListAdapter 与普通的 adapter 的不同之处。可是写到这里也只是实现了一个普通的展示一个普通列表的功能,那分页加载功能如何实现呢?这时候就不得不提到 PagedList.BoundaryCallback 了。它会告诉我们什么时候是初始化数据,什么时候要加载更多。我们主要重写 BoundaryCallback 里面的两个方法,其中的 onZeroItemsLoaded 告诉我们数据库中没有数据,代表首次加载,当然也可能是数据库被用户清除情况下的首次加载,onItemAtEndLoaded 则会在数据库中最后一条数据返回后回调,告诉我们需要再次从网络加载数据了。

那么 BoundaryCallback 怎么与 pagelist 结合起来呢?可以把它当做 LivePagedListBuilder 的一个属性给设置进去,这样 BoundaryCallback 就可以响应到数据库里面的变化,进而触发网络请求。到这里可能会有人有疑惑,就是网络请求回来了,插入了数据库,然后我们怎么通知界面数据有变化了呢?如果按照咱们不使用 jetpack 组件的逻辑来说,可能会发个通知,让界面再查询一遍数据库,或者加个接口回调之类的,但是有了 jetpack 里面的 room,这些都不用了,因为咱们上面说了 LivePagedListBuilder 最终会构造出来一个 LiveData 给界面使用,而在每次我们插入数据的时候,这个给这个 LiveData 添加的 observer 就会响应,本质上算观察者模式,这样界面就能够响应到数据库中数据的变化。

至此我们最开始提到的第三种数据库 + 网络请求的模式就算说完了。不过我们平时需求中这种模式使用的并不多,更多的还是直接从网络请求回来数据,这也就意味着我们的 datasource 变了,我们的 datasource 没法直接由数据库给我们提供了,我们需要自己构造 datasource。自定义 datasource,我们可以继承 PageKeyedDataSource、ItemKeyedDataSource 以及 PositionalDataSource。这三种有什么区别呢?PageKeyedDataSource 顾名思义就是以 page 作为 key 的 datasource 例如我们平时的上拉加载更多分页加载就适合使用它,因为我们知道 pageId 或者要加载哪一页就好了。而 ItemKeyedDataSource 意思则是每一下次的请求总会依赖上一次的请求结果,不像 PageKeyedDataSource 每次加载之间都那么独立。而第三种 PositionalDataSource 意为我们可以从任意位置处加载数据,还没有想到应用场景。这三种中小胖觉得也就 PageKeyedDataSource 会用的比较多。

接下来我们就以最常用的 PageKeyedDataSource 来构造 datasource,来跟大家演示如何直接从网络加载数据实现分页加载,我们继承了 PageKeyedDataSource 之后主要重写两个方法,loadInitial 这个方法调用的时候代表是首次从网络请求数据,类似于 BoundaryCallback 里面的 onZeroItemsLoaded,关键的地方在当网络请求成功的时候我们需要将数据响应到界面上,这里要做的操作就是使用 loadInitial 里面的 LoadInitialCallback 的 onResult 方法进行回调,回调了之后就会将数据同步到 pagelist。loadAfter 方法调用的时候代表上滑加载更多被触发了,需要加载更多数据了,从网络请求完数据之后,会通过 LoadCallback 的 onResult 进行回调,进而将数据同步到 pagelist。

经过以上步骤我们只是做了一个 datasource 的实现,具体的 DataSource 的构造还得通过继承 DataSource.Factory 然后在其 create 方法里面进行实例化,而后再将这个 datasource 传入 LivePagedListBuilder 即可,至此之后就跟上面讲的第三种模式一样了,adapter 啥的也不用动。但是这里实现的单纯从网络加载数据的功能只是一个正常功能,好比那种没有数据的情况怎么处理?没有更多数据的怎么处理?这些依然需要开发者自己来处理,当在 loadInitial 里面发出的网络请求返回的数据为空,就代表没有数据,当在 loadAfter 里面发出的网络请求返回的数据为空,则代表没有更多数据。开发者可以将这些事件通过 LiveData 这种形式响应到视图层。

一些需要特殊注意的点:
1、我们知道无论 datasource 是数据库 + 网络请求还是只有网络请求,我们最终都会通过 LivePagedListBuilder 构造出一个 LiveData 给到视图层,但是在这两种模式下添加在 LiveData 上的 observer 响应的频率却是不同的,直接 datasource 是数据库的那种,只要数据库中的数据有变化,那么 LiveData 对应的 observer 就会收到响应,也就是说每次界面要更新都必须通过此 LiveData 的 observer 操作 adapter,具体操作就是 adapter.submitList(),里面传入的是 pagelist。

而直接 datasource 是网络请求跟这个是不一样的,它只会在那个 LiveData 首次被添加 observer 也就是变为 active 也就是 onActive 的时候会被响应一次,在这里将 LiveData 携带过来的 pagelist 与 adapter 绑定,而后数据有任何变化都不会响应到 这个 LiveData 的 observer 了,那数据有变化了,怎么响应到界面上呢?

这就得提到咱上面说的 loadInitial 和 loadAfter 了,我们上面说了在这俩方法网络请求成功之后会调用对应的 callback 的 onResult 方法,通过打断点会看到最终会调用到 pagelist 所在的 adapter 的 notify 方法,所以也不需要我们自己在 observer 里面 submitList 了,换言之从数据的获取到数据响应到 UI 上,都由 pagelist 来完成。

2、我们在 loadInitial 里面调用 callback 的时候可以选择是否传入 totalCount,就是利用 totalCount 告诉 pagelist 所加载列表的总条目数,那么告诉 pagelist 总条目数有什么用呢?这需要结合 PagedList.Config 的 mEnablePlaceholders 属性来看,当我们 callback 的时候传入了 totalCount,且 setEnablePlaceholders(true),那么我们进入列表页面的时候,给我们的感觉就是所有的数据已经加载了,如果 recyclerview 的 scrollbar 展示的话,会发现 scrollbar 比较短,但其实此时也只是加载了一次数据而已,之所以会有加载了所有数据的感觉,是因为我们使用了占位符,当我们快速滑动页面的时候会看到那些还未加载的条目上面都是我们设置的默认值,只是当数据加载完成的时候默认值会被替换为实际的值。设置占位的目的也是为了减少页面加载数据时候的跳动感。

3、这个严格来说是关于 LiveData 的,咱们上面说过第三种模式也就是数据库 + 网络请求的,假设有这么个需求如果一旦数据库中已经有了缓存,就不再从网络请求加载了,这个该怎么实现呢?我们知道目前情况下我们从 room 数据库里面查询出来的是 LiveData,可能很多人也跟我一样第一想法就是直接拿这个 LiveData 来做判断,因为我们可以通过 livedata.getValue 来获取存储在其里面的值,这里来说就是从数据库中查询出来的 list,只要判断这个 list 为 null 或者长度为 0 不就好了吗?想法是完美的,可是现实是残酷的,对于 LiveData 是不能用直接获取值的方式来做任何判断的,因为 LiveData 的赋值是异步的,也就是说我们只能够在对 LiveData 添加的 observer 里面获取其值,也只有在这地方才能够获取到它真正的值,通过我们一开说的那种直接获取值的方式一定是 null,即使已经赋值完成。

那我们知道了只能在 observer 里面来做判断了,可是这不是又把数据加载的逻辑放到了视图层吗?因为我们只在 activity 里面有对这个 LiveData 添加 observer,那怎么办?我们也不能在数据获取层给 LiveData 添加 observer,我们只能在数据库的 Dao 层在写一条 sql,可以直接把数据库中符合条件的数据的 count 查出来,然后进行判断就好了。

但是还有个注意点就是关于 room 数据的操作必须都得在非 UI 线程,换言之就是只要从数据库中查询出来的不是 LiveData,那么就需要我们自己切换线程。

Android Jetpack架构组件之 Paging(使用、源码篇) 1、前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。 Android Architecture组件是Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件: 带你领略Android Je... 阅读详情

相关推荐

Android_Jetpack:Paging组件之BoundaryCallback的使用

Paging组件除了单纯地支持网络、数据库为数据源外,还支持网络+数据库的架构方式,这就用到了BoundaryCallback。本文我们会使用PositionalDataSource方式加载数据,来简化多数据源应用的复杂度。 BoundaryCallback的使用流程如下: 通过流程图可知,数据库是页面的唯一数据来源:页面订阅了数据库的变化,当数据库中的数据发生变化时,会直接反映到页面上。 若数据库中没有数据,会通知BoundaryCallback中得到onZeroItemsLoaded方法;若数据库中

nanquan11的博客 767

Paging3、Room使用,1、从本地Room数据库加载 2、直接网络获取数据加载 3、网络访问数据到Room数据库再加载 4、封装使用

Paging3、Room使用,1、从本地Room数据库加载 2、直接网络获取数据加载 3、网络访问数据到Room数据库再加载 4、封装使用

autumn_later的博客 2806

Android Jetpack核心组件详解与实战技巧

Android Jetpack是Google官方推出的现代化开发组件集合,通过架构组件如ViewModel、LiveData和Room等,实现了数据持久化、生命周期管理和UI更新的高效协同。其核心原理基于观察者模式和响应式编程,能显著提升开发效率并降低内存泄漏风险。在电商、社交等高频数据交互场景中,Jetpack的Paging组件解决了大数据量分页加载的性能瓶颈,而WorkManager则优化了后台任务调度。本文深入解析12个常用Jetpack库的最佳实践,包括ViewModel的数据共享技巧、LiveDa

weixin_30414305的博客 413

谷歌 I/O 深度解析:Android Jetpack 最新变化

2022年 谷歌 I/O开发者大会顺利闭幕,本次大会带来哪些 Android Jetpack 的最新变化呢?

移动端开发干货分享 2366

room-homepage:初始房间首页挑战完成

前端导师-房间主页 欢迎! :waving_hand: 感谢您检查此前端编码挑战。 挑战使您可以提高现实工作流程中的技能。 为了应对这一挑战,您需要对HTML,CSS和JavaScript有基本的了解。 挑战 您面临的挑战是建立此电子商务主页,并使它看起来与设计尽可能接近。 您可以使用任何喜欢的工具来帮助您完成挑战。 因此,如果您有想要练习的东西,请随时尝试。 您的用户应该能够: 根据设备的屏幕尺寸查看网站的最佳布局 查看页面上所有互动元素的悬停状态 使用鼠标/触控板或键盘浏览滑块 需要挑战方面的支持吗? 并在#help频道中提问。 在哪里找到所有东西 您的任务是将项目扩展到/design文件夹中的/design 。 您会发现该设计的移动版和桌面版均可使用。 设计为JPG静态格式。 这意味着您需要对诸如font-size , padding和margin等样式使用最佳判断。 这应该有助于训练您的眼

第1期技术: DQN算法原理及实现过程

利用神经网络近似值函数的方法表示为: V^(s,w)≈Vπ(s)q^(s,a,w)≈qπ(s,a) \hat{V}(s, w) \approx V_{\pi}(s) \\ \hat{q}(s, a, w) \approx q_{\pi}(s, a) V^(s,w)≈Vπ​(s)q^​(s,a,w)≈qπ​(s,a) 那么具体的工作过程是怎样实现的? 以及如何从端到端的过程,本文将讲解Deep Q Network(DQN, 而这正是由DeepMind于2013年和2015年分别提出的两篇论文《Playi

深度强化学习实验室:一个“开源开放、共享共进”的强化学习学术组织。 4953

MVVM: ViewModel+LiveData+DataBinding+Retrofit+Room+Paging+RxJava 总结与实践(Java实现)

最近,阅读了国外一篇关于viewmodel+livedata的文章https://proandroiddev.com/mvvm-architecture-viewmodel-and-livedata-part-1-604f50cda1 ,收益良多,纸上得来终觉浅,绝知此事要躬行,决定自己也亲手撸一个demo。 一两句话和一两个图总结: LiveData作用 (1)实际上就是一个观察者模式的......

xiaobaaidaba123的专栏 6753

了解随机振动疲劳分析中 Ansys nCode DesignLife 的平均应力校正

通过选择静态环境,我们可以将其结果视为疲劳计算的平均应力,如图 3 所示,因此从静态偏移载荷工况中提取的平均应力用于转移预测雨流计数中所有循环的平均值。您可以通过观看下面的教学视频获得宝贵的见解,该视频将指导您完成利用 Ansys nCode DesignLife 分析平均应力对随机振动载荷下结构的影响的过程。它基于 R 比率或平均应力水平。另一方面,平均应力校正可以帮助消除平均应力的负面影响,提高结果的保真度。Ansys nCode 提供先进的平均应力校正技术,使工程师能够考虑平均应力对疲劳寿命的影响。

jkh920184196的博客 1518

Paging3-分页数据加载库(结合Room)

Paging3 结合 Room使用. 实现 NetWork 和 Db 数据处理. 实现 条目增删改操作. MVVM模式数据绑定. 以及部分注意事项.

孟老板的博客 3493

国产谷歌地球,地形分析秒杀同款地图软件

咱们做地质、林业、水文、水利、电力、GIS、地图、水保、环境的,需要经常用到各种数据,比如影像、地形、矢量、模型等,但目前80%的规划大数据展示都离不开ArcGIS,令人头大的是很多朋友连ArcGIS软件安装起来都费劲。。。 那不会ArcGIS又装不了Google Earth怎么开展工作? 今天推荐大家一款国产免费专业地图浏览下载测量分析神器—图新地球 图新地球,国产三维gis软件。可以查看高清卫星影像地形以及其他很多常用电子地图,对地图需求的掌握远胜过Google Maps,而且上手比国外软件要简单

GISWorld3D的博客 3685

LangFuse部署与实践

LangFuse的原理主要是基于可观察性和分析技术来监控和优化低延迟消息(LLM)应用。它提供了一套完整的解决方案,通过收集、处理和分析LLM应用在运行过程中产生的各种数据,来生成实时的、深入的、可操作的见解。通过提供实时的、深入的见解和可视化的跟踪功能,LangFuse使得识别和解决应用性能问题变得更加简单和高效。总的来说,LangFuse的原理是通过综合运用可观察性和分析技术,来提供对LLM应用的全面监控和优化能力。这使得开发者和运维团队能够更加高效地管理和维护他们的应用,从而提升用户体验和业务效益。

pumpkin84514的博客 7940

Android Jetpack -- paging & room

看到这些博客的时候,相信小伙伴们已经看了不少的有关于Android Jetpack的知识了,关于Jetpack的原理,有些文章讲的很好,这里就不重复了,此系列的博客,旨在通过一些很简单的小demo,和大家一起熟悉最基本的用法~ Android Jetpack -- Lifecycle Android Jetpack -- ViewModel & LiveData Android Je...

sinat_33150417的博客 555

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

Android jetpack的Paging和Room结合使用

介绍 Paging主要是用来结合RecyclerView进行使用,是一种分页加载解决方案,这样Paging每次只会加载总数据的一部分。 Room是Google提供的一个ORM库。 本文的代码来自官方例子:官方示例地址 使用Paging Room 添加依赖 def room_version = "2.2.0-alpha02" implementation "androidx.r...

Android小菜比的博客 1416

路径规划 | 图解RRT*算法(附ROS C++/Python/Matlab仿真)

RRT*算法针对传统RRT算法进行了渐进最优改进,在添加节点到搜索树的过程中进行重连选择。本文图解RRT*算法原理,并采用ROS C++、Python、Matlab三种语言实现算法,加深理解

FRIGIDWINTER的博客 9405

智能车图像处理19-进阶篇11--斜入十字补线

这篇文章主要讲述智能车竞赛中如何对于斜入十字进行补线操作。

taiyuezyh的博客 7482

JetPack——Paging3+Room

paging3 Room先从Room中读取数据,当数据为空时,利用UserRemoteMediator从网络获取数据,将获取的数据写入数据库,并更新UI

松仔Log的博客 363

YOLO系列算法改进 | 主干改进篇 | 替换LSKNet主干特征提取网络 | 通过动态调整感受野自适应融合长程上下文,显著提升小目标与复杂背景下的检测精度!

YOLO系列算法改进 | 主干改进篇 | 替换LSKNet主干特征提取网络 | 通过动态调整感受野自适应融合长程上下文,显著提升小目标与复杂背景下的检测精度! (以YOLO26最新目标检测模型为基础,利用LSKNet替代Backbone)

2502_91881744的博客 212

Android Jetpack 库架构组件 Room+Paging 基础使用

上篇文章 Android Jetpack 库架构组件 ViewModel+LiveData 基础使用 的示例2中,使用 ViewModel+ LiveData 的方式实现了数据库数据查询并分页显示的效果,而这里的数据库用的就是Room,分页使用的 Paging。 Room 是什么 Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。 也就是 Room 是在SQlite的基础上封装了接口,使得SQlite更加易.

龙衣 3138

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android Jetpack组件之 Paging使用-源码

2、Paging简介 分页库概述 Paging Library中DataSource,PagedList,PagedAdapter三者之间的关系以及数据加载到数据展示的流程 比如当一条新的item插入到数据库,DataSource会被初始化,LiveData后台线程就会创建一个新的PagedList。这个新的PagedList会被发送到UI线程的PagedListAdapter中,PagedListAdapter使用DiffUtil在对比现在的Item和新建Item的差异。当对比结束,PagedLi

Jason_Lee155的博客 539

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

基于Jetpack之Paging控件分页加载瀑布式列表

Paging是Jetpack推出的分页加载组件,可以应用于分批次从网络/本地数据库请求数据,实现分批加载显示的功能。本文结合Room本地数据库展示Paging分页展示的功能实现过程,以及部分原理的说明

qq_38237224的博客 1075

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Jetpack成员Paging库的数据库实践和源码分析

其中,Jetpack的Paging库是一个用于处理分页数据的组件,它能够有效地加载和显示大量数据,提供流畅的滚动体验。总结起来,Jetpack的Paging库是一个强大的工具,用于处理大量数据的分页加载和显示。通过适当地配置和使用Paging库,开发人员可以实现高效的数据加载和流畅的滚动体验。Room是一个用于操作SQLite数据库的库,它提供了一种方便的方式来定义数据库实体、访问对象(DAO)和数据库。Paging库的源码实现涉及了许多细节和复杂的逻辑,包括数据加载算法、数据预取、数据变化的处理等。

VyfcClojure的博客 164

Android Jetpack架构组件-Room数据库查询艺术

目录一、Room 中的数据库关系查询1.1、 一对一关系1.2、 一对多关系1.3、多对多关系二、配合Rxjava的使用三、配合LiveData的使用四、配合Paging框架的使用五、结语 在阅读本文前,需要先了解Room框架的使用,入门可点击笔者Android Jetpack架构组件-Room基本使用文章 一、Room 中的数据库关系查询 设计一个关系型数据库很重要的一部分是将数据拆分成具有...

One X的博客 4066

Android Jetpack Paging3分页库的使用二(本地数据源和数据流变换)

来自网络和数据库的页面 分页库提供了RemoteMediator组件用于此场景。RemoteMediator会管理数据从网络加载到本地数据库的过程。 本指南假定您熟悉Room Persistence库和Paging库的基本用法。 基本用法 假设您希望您的应用将User信息从网络数据源,加载到存储在Room数据库中的本地缓存中。 下图说明了如何RemoteMediator和 PagingSource一起工作来满足此场景。 一个RemoteMediator将来自网络的分页数据加载到数据库中,但不直接将数据加载

Journey的博客 2305

Android Jetpack架构组件-Paging介绍及实践

目录Android 列表分页组件Paging的设计与实现一、分页组件的简介1.核心类 PagedList2.数据源:DataSource及其工厂3.串联两者:PagedListBuilder4.更多可选的配置:PagedList.Config4.1.分页数量:PageSize4.2.初始加载数量:InitialLoadSizeHint4.3.预取距离:PrefetchDistance4.4.是否启...

One X的博客 1609
上一篇: LiveData 里面 Transformations 的 map 以及 switchMap
下一篇: Jetpack 里面的 WorkManager
和小胖
博客等级 码龄12年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值