惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
有赞技术团队
有赞技术团队
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
D
DataBreaches.Net
F
Full Disclosure
腾讯CDC
博客园 - 【当耐特】
MyScale Blog
MyScale Blog
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
The Register - Security
The Register - Security
WordPress大学
WordPress大学
博客园 - 聂微东
雷峰网
雷峰网
J
Java Code Geeks
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
G
Google Developers Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
O
OpenAI News
Project Zero
Project Zero
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
P
Palo Alto Networks Blog
Schneier on Security
Schneier on Security

u3blog

从手动配置到自然语言生成规则:一个 Android AI 工具的重构实录 - u3blog 学习版游戏自制云存档同步的方法探索以及总结 - u3blog 鸿蒙next中web组件和navigation的一个bug以及处理方案 - u3blog ChatGPT是怎么帮我写ios代码的 - u3blog Android项目cicd流程总结(使用jenkins) - u3blog Android使用Logger开发App本地日志记录功能 - u3blog 一张启动图引发的思考--探索.9图原理和应用场景 - u3blog Android中使用ASPECTJ进行用户操作路径跟踪与日志搜集 - u3blog 彻底摆脱数据线——远程ADB调试小工具开发过程记录 - u3blog 自己实现一个Android网络图片加载器 - u3blog
跟我一起玩Paging3 - u3blog
2022-10-08 · via u3blog

什么是Paging3

Paging 库可帮助您加载和显示来自本地存储或网络中更大的数据集中的数据页面。此方法可让您的应用更高效地利用网络带宽和系统资源。Paging 库的组件旨在契合推荐的 Android 应用架构,流畅集成其他 Jetpack 组件,并提供一流的 Kotlin 支持。
以上来自安卓官网,简单点来说,就是帮你处理列表分页加载工作的一个官方框架,从名字也能看出来。而且已经到达了第三个版本,paging3。

如何使用Paging3

使用paging3总共有以下几个步骤

  1. 定义PagingSource – 需要在这里处理如何获取数据和如何处理页面的号码
  2. 设置 PagingData 流 – 需要把pagingsource的实例和一些其他参数传递给构造器,比如每次加载的条目数量等等
  3. 定义 RecyclerView 适配器 – 需要继承PagingDataAdapter并提供DiffUtil.ItemCallback的实例
  4. 在界面中显示分页数据 – 在页面中绑定adapter
    通过以上几个步骤我们就可以使用paging3了,如果想看具体的步骤,可以移步官网,我们今天不用沉溺于具体的细节当中

    Paging3有哪些方便的地方

    毫无疑问,使用paging3会带给我们一些开发效率上的收益,回想一下我们以前是如何处理分页列表的,检测列表是否到达底部,使用自己持有的页数去做网络请求,把数据添加到原有的集合,更新列表。

是不是简单的回想一下就感觉到不少坑了呢,没错,我们自己做列表分页加载不仅繁琐无趣,还容易出问题。

这些工作交给paging3之后,我们只需要关注逻辑部分就可以了,如何获取数据,想以怎样的形式展示数据,这才是我们需要关注的焦点。

总结一下paging3的优点,替代了大量的琐碎分页加载代码,让逻辑和页面的耦合度降低,由官方的工程师保证了加载的正确性和效率。

Paging3有哪些不方便的地方

相信看了上面的优点之后大家都迫不及待的想去把以前的老代码干掉,换成这种看起来方便又省事的工具了。

但是在换之前,我这里先提几条使用paging3容易遇到的坑,帮助大家综合考量是不是真的要去使用这个工具框架。

  1. 对数据源有一定要求,有时候会提示indexoutofbounds,这种情况需要检查你提供的数据源,而不是adapter
  2. 使用paging3官方教程上需要继承PagingDataAdapter,这个问题可以通过装饰模式来解决,具体可以参考这篇文章
  3. paging3的pagingdataadapter虽然提供了refresh方法,但是调用之后数据源并没有获得通知,需要手动调用一次notifyDataSetChanged再去调用refresh才能让列表刷新之后继续触发分页加载,这是一个已知的bug,希望后期得到解决
  4. paging3的列表中由于写法的原因,对于多种不同item的展示存在一定困难性,如果现在已经有多item逻辑的话,修改起来比较麻烦

    Paging3的原理分析

    关于paging3的原理,网上的文章已经很多了,相信大家也不想看到我再重复长篇大论,这里放一张官方架构图给大家


简单的总结一下原理就是,数据源把数据放入pager,pager使用flow(kotlin协程提供的对标rxjava的工具)将数据传递到adapter并处理和维护页数,adapter里面再使用DiffUtil.ItemCallback结合上自身的一些api对新来的数据做比对,再进行数据的处理,最后反应到页面上。