下图为您应用的各个层级中推荐直接接入 Paging 的 Android 应用架构: ? Paging 组件及其在应用架构的集成 定义数据源 数据源的定义取决于您从哪里加载数据。...即可,如果您使用了 Room,从 2.3.0-alpha 开始,它将默认为您实现 Paging Source,请参见: Android 开发文档|使用 Room DAO 访问数据; 如果您从一个 多层级数据源...您可以实现 load() 函数来从数据源获取分页数据,并返回加载好的数据和加载前后页的参数信息。...如果要创建 PagingData 数据流,您需要创建一个 Pager 实例,并提供一个 PagingConfig 配置对象和一个可以告诉 Pager 如何获取您实现的 PagerSource 的实例的函数...有分隔符的列表 向列表中添加 分隔符 同样是分页数据转换,这里我们通过转换 PagingData 向列表中插入分隔对象。举例来说,我们可以为狗狗的名字插入字母分隔符。
一、Paging简介 在Android应用开发中,我们经常需要以列表的方式来展示大量的数据,这些数据可能来自网路,也可以来自本地的数据库。为了避免一次性加载大量的数据,对数据进行分页就显得很有必要。...[在这里插入图片描述] 如上图所示,主要的步骤如下: 使用DataSource从服务器获取或者从本地数据库获取数据。 将数据保存到PageList中。...三、Paging3 3.1 概述 Paging是JetPack框架提供的一个分页库,它可以帮助开发者从本地存储或通过网络加载显示数据,不过由于历史原因,早期的Paging存在各种使用上的问题,因此Android...对象都对应一个数据源,以及该如何从该数据源中查找数据,PagingSource可以从任何单个数据源比如网络或者数据库中查找数据。...如果要创建 PagingData 数据流,那么需要创建一个 Pager 实例,并提供一个 PagingConfig 配置对象和一个可以告诉 Pager 如何获取您实现的 PagerSource 的实例的函数
,这里的意思就是 我们传Int类型的值(如页码)得到返回的数据信息DemoReqData对象。...这句话翻译过来的意思就是:Pager对象从PagingSource对象调用load()方法,为它提供LoadParams对象,并作为回报接收LoadResult对象。...Paging的加载状态 Paging3 为我们提供了获取Paging加载状态的方法,其中包含添加监听事件的方式以及在adapter中直接显示的方式,首先我们来看监听事件的方式 使用监听事件方式获取加载状态...除此之外,Paging3中还有一个比较重要的RemoteMediator,用来更好的加载网络数据库和本地数据库,我们后续有机会再为大家单独分享吧~ 2020年11月21日更新 paging3的设计理念是不建议对列表数据直接修改...大致意思就是如果数据发生变化 必须创建新的PagingData ,所以暂时我也不知道如何可以在不重新请求的情况下,在数据删除、新增后来刷新,如果你有好的方案,欢迎赐教!
实现列表功能,Paging3和Paging2一样,支持数据库缓存 一、依赖 主项目gradle中导入hilt插件 dependencies { classpath "com.android.tools.build...,接下来就要实现配置Pager,PagingSource我们已经实现了从数据库获取,现在需要的实现的是:网络数据使用RemoteMediator获取 1.网络数据获取:RemoteMediator 结合最初的架构图...,RemoteMediator是用于获取网络数据,并将数据存入数据库,我们就可以从数据库获取PagingSource,传递给后续的Pager @OptIn(ExperimentalPagingApi::...:Repository 定义一个Repository接口获取Flow>数据,T应该为MovieItemModel,因为对外(ViewModel)而言,使用的都是MovieItemModel...网络对象,对内使用的才是MovieEntity数据库对象 interface Repository { fun fetchList(): Flow>
为什么使用 Paging 3.0? 向用户展示一列数据是最常见的 UI 模式之一。当您需要加载大量数据时,可以通过分块异步获取/显示数据来提升应用性能。...置入数据 在您应用的架构方案中,Paging 3.0 最适合作为从数据层获取数据并通过 ViewModel 在 UI 层传输数据来对其进行转换和呈现的一种方式。...每当 Paging 库想要加载新的数据来替代当前列表 (例如,下拉刷新或数据库更新、配置变更、进程终止等情况的发生而导致数据失效) 时,便会发生刷新操作。...当用户滚动列表时,PagingData 会持续从 PagingSource 中获取数据以提供内容。...后续 按照如上步骤,我们已经将 Paging 3.0 集成到了您应用的数据层中!如何在 UI 中消费 PagingData 以及填充我们的仓库列表,敬请关注我们后续的文章。
在上一篇 Paging 3.0 简介 的文章中,我们讨论了 Paging 库,了解了如何将它融入到应用架构中,并将其整合进了应用的数据层。...我们使用了 PagingSource 来为我们的应用获取并使用数据,以及用 PagingConfig 来创建能够提供 Flow 给 UI 消费的 Pager 对象。...ListAdapter 切换到 PagingDataAdapter 接下来,我们开始从 PagingData Flow 中收集数据,我们可以这样使用 submitData 挂起函数将它的发射绑定到 PagingDataAdapter...结束加载时滚动到列表的顶部 使用 withLoadStateHeaderAndFooter() 实现当获取数据时将加载栏添加到 UI 上 感谢您的阅读!...敬请关注下一篇文章,我们将探讨用 Paging 实现以数据库作为单一来源,并详细讨论 LoadStateFlow!
另外这里还引入了Retrofit的库,因为待会我们会从网络上请求数据,并通过Paging 3进行分页展示。...接下来调用刚才在GitHubService中定义的searchRepos()接口,并把page和pageSize传入,从服务器获取当前页所对应的数据。...注意LoadResult.Page()函数接收3个参数,第一个参数传入从响应数据解析出来的Repo列表即可,第二和第三个参数分别对应着上一页和下一页的页数。...submitData()接收一个PagingData参数,这个参数我们需要调用ViewModel中返回的Flow对象的collect()函数才能获取到,collect()函数有点类似于Rxjava中的subscribe...因为Paging 3会在列表还远没有滑动到底部的时候就提前加载更多的数据(这是默认属性,可配置),从而产生一种好像永远滑不到头的感觉。
迁移过程 初衷 据Cash App称,他们想在跨平台中使用分页逻辑,但是AndroidX Paging只支持Android平台。...最主要的是,paging-common中的API与AndroidX 下的API完全相同,仅仅是将包从androidx.paging迁移到了app.cash.paging中,所以这部分的使用我们直接按照AndroidX...如果之前项目已经使用了AndroiX的Paging库,则可以在Android平台上无缝迁移。...项目架构 从项目架构中可以看出在共享模块中,只有iosMain并没有AndroidMain,这是因为我们前面所讲到的针对Android平台是可以无缝迁移的。...定义Pager与PagerSource 定义查询数据的方法 定义HttpClient对象 这里的网络请求框架使用的是Ktor,代码如下所示: private val httpClient
在 App 中,列表数据加载是一个很常见的功能,几乎大多数 App 中都存在列表数据的展示,而对于大数据量的列表展示,为提高用户体验、减少服务器压力等,一般采用分页加载列表数据,首次只加载一页数据,当用户向下滑动列表到底部时再触发加载下一页数据...下面将通过代码介绍具体如何实现列表分页加载的封装。 整体介绍 在看具体实现之前,先带大家从整体结构、最终实现的功能、使用到的三方库上做一个整体介绍。...); /// 列表数据 List data = []; } PagingState 有一个泛型 T 为列表 data 的 item 类型 ,即列表数据 item 的数据实体类型。...类型对象。...分页参数创建好后,调用抽象方法 loadData 传入创建好的参数,返回 PagingData 数据,即分页数据实体,源码如下: class PagingData { int?
Paging是一个用于分页加载的组件,对于一些列表数据,以前大家都使用过的一种方式是定义一个page,当达到加载更多条件时,page加一再去请求数据,为此我们要写很多重复的代码,Paging就对分页进行了一个封装...Paging由分为三个模块 1.DataSource:数据从该模块中获取,数据可以来源于网络、本地数据库等 2.PagedList:负责具体获取数据的逻辑,何时获取、加载下一页、预加载等 3.PagedListAdapter...:RecyclerView的adapter需要继承它,内部做了一系列处理 一、Paging上手 1.PositionalDataSource PositionalDataSource适合于从任意位置获取数据的情况...,入参为开始点和数据量大小 首先我们要获取网络数据、使用LiveData、Paging等,需要添加依赖: implementation 'com.squareup.retrofit2:retrofit...} }); } } 其他的就不用改动了,效果和上面是一样的 3.ItemKeyedDataSource ItemKeyedDataSource使用于不固定的数据列表
} } 和 DataApi接口,这里我们将方法声明为挂起函数,便于在协程中调用 interface DataApi { /** * 获取数据 */ @GET...,这里的意思就是 我们传Int类型的值(如页码)得到返回的数据信息DemoReqData对象。...这句话翻译过来的意思就是:Pager对象从PagingSource对象调用load()方法,为它提供LoadParams对象,并作为回报接收LoadResult对象。.../** * 获取数据 */ fun getData() = Pager(PagingConfig(pageSize = 1)) { DataSource...当然在实际开发中,上面的代码会有很多问题,以及Paging为我们提供了更多且有用的功能,我们将在下一篇中继续为大家分享~ Android Jetpack系列 之分页库Paging3(二)~敬请期待
对我们来说十分方便的是 Paging 库在 Room 库一些小小的帮助下已经可以应对这种场景。下面就让我们开始吧!点击这里 查看 Paging: 显示数据及其加载状态视频,了解更多详情。...本地的数据库要如何填充数据呢?来看看 RemoteMediator,当数据库中的数据加载完毕时,它负责从网络加载更多数据。让我们看看它是如何工作的。...使用这些信息更新我们的 UI 就像从 PagingAdapter 暴露的 loadStateFlow 中获取数据一样简单。...emptyList.isVisible = isListEmpty // 无论数据来自本地数据库还是远程数据,仅在刷新成功时显示列表。...refresh is LoadState.Error && repoAdapter.itemCount == 0 } } 我们开始从 Flow 收集数据,并在 Pager 尚未加载且现存列表为空时
前面我们使用过Paging,最新版本Paging3和以前对比,有所改动 Paging2->Paging3三个模块改为: 1.DataSource->PagingSource : 数据从该模块中获取,数据可以来源于网络...、本地数据库等 2.PagedList->Pager : 负责具体获取数据的逻辑,何时获取、加载下一页、预加载等 3.PagedListAdapter->PagingDataAdapter : RecyclerView...getApi(clazz: Class): T { return instance.create(clazz) as T } } 4.定义RecyclerView的Adapter...import com.aruba.paging3application.entity.Movies /** * Pagind获取数据层 * Created by aruba on 2021/9/...initialLoadSize: Int = pageSize * DEFAULT_INITIAL_PAGE_MULTIPLIER, // 默认PagingConfig为pager分配初始获取数据的大小为
>>>> Paging Library 库的架构 ? 从图中可以看出,Paging是围绕PagedList为中心的,遵循数据驱动的思想。...比如加载第N+1条需要第N条的数据,这时候需要传第N条的数据过去。 PositionalDataSource:适用于数据总量固定,支持从特定位置加载数据的场景。...>>>> PagedList PagedList从DataSource中获取数据,通过PagedList.Config 可以配置一次加载的数量以及预加载的数量,它也为RecyclerView.Adapter...PagedStorage:用于存储加载到的数据,它包含一个ArrayList>对象mPages,按页存储数据。...userDao是model对象,可以从数据库取到User返回DataSource.Factory对象,我们将DataSource.Factory传给LivePagedListBuilder,并配置PagedList
Paging专注于有大量数据请求的列表处理,让开发者无需关心数据的分页逻辑,将数据的获取逻辑完全与ui隔离,降低项目的耦合。...这是因为,它会将数据统一封装成一个PagedList对象,而adapter持有该对象,一切数据的更新与变动都是通过PagedList来触发。...一个基于Paging的Database列表已经完成,是不是非常简单呢?...如果需要完整代码可以查看下面的Github链接 https://github.com/idisfkj/android-api-analysis 3 自定义DataSource 上面是通过Room来获取数据...} } 其中loadBefore暂时用不到,因为我这个实例是获取新闻列表,所以只需要loadInitial与loadAfter即可。
,感觉出来了很多 API, 不知道从哪里下手。...首先,我们按照 列表分页加载 这个行为进行一个基本的划分,分为 2 个部分, 数据 和 UI, paging 就是按照这个来进行划分的 数据 数据部分 paging 包括 PagedList 一个继承了...AbstractList 的 List 子类, 包括了数据源获取的数据 DataSource 数据源的概念,分别提供了 PageKeyedDataSource、ItemKeyedDataSource、...对象的列表。...一般情况下,我们最原始的方式,列表 UI 所在的部分,是需要知道数据的来源等逻辑部分,我们在常见的 mvp 模式中,会对数据和 UI 进行分层。
但是Jetpack远不止这些组件,今天的主角—Paging,Jetpack中的分页组件,官方是这么形容它的:‘’逐步从您的数据源按需加载信息‘’ 1....,它将加载更多的数据 Config PageList从DataSource中加载数据的配置 PagedStorage 用于存储加载到的数据 Config属性: pageSize:分页加载的数量 prefetchDistance...(item) } } 3.3 PagingWithNetWork 使用 上面我们通过Room进行了数据库加载数据,下面看一下通过网络请求记载列表数据: 和上面不同的就是Respository数据源的加载...那么我们的数据源从哪里获取呢,可以看到Listing的第一个参数pageList = livePageList,livePageList通过LivePagedListBuilder创建,LivePagedListBuilder...method=download&shareKey=460a039c8e8695464d321519258a104b)] 总结一下,Paging的基本原理为: 使用DataSource从网络或者数据库获取数据
Paging出现后,则只需要对数据进行变更,无需手动刷新UI,其内部会对数据源进行diff操作(基于Myers 差分算法),然后选择合适的方式刷新UI,同时他还处理了数据的分页加载。...Jetpack笔记代码 本文源码基于SDK 29 使用 引入依赖: def paging_version = "2.1.1" implementation "androidx.paging:paging-runtime...:$paging_version" 创建一个ViewModel //PagingViewModel.java private UserDao mUserDao; //dao对象用来从数据库中获取数据...//用room返回的DataSource.Factory来构建数据列表 mLiveData = new LivePagedListBuilder(factory, config).build...LivePagedListBuilder如何构建数据源 分析前需要先理解几个概念,PagedList是具体的数据列表,由DataSource数据源提供数据,DataSource又由DataSource.Factory
领取专属 10元无门槛券
手把手带您无忧上云