当前位置:首页 > 技术文章 > 正文内容

跟我一起玩Paging3

u3blog2年前 (2022-10-08)技术文章594

什么是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对新来的数据做比对,再进行数据的处理,最后反应到页面上。

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=699

分享给朋友:

“跟我一起玩Paging3” 的相关文章

AndroidStudio插件开发——RemoveButterKnife从构思到实现

AndroidStudio插件开发——RemoveButterKnife从构思到实现

ReomveButterKnife插件这是一个用于移除代码中对ButterKnife使用的AS插件,接下来我们将从头开始讲讲AS插件开发和这个插件的开发过程地址是<a href="https://github.com/u3shadow/RemoveButterKnife"...

项目的改造——RemoveButterKnife插件代码的重构

项目的改造——RemoveButterKnife插件代码的重构

前言这篇文章记述了我的插件RemoveButterKnife的代码改进过程以及思路,关于插件,各位可以看RemoveButterKnife代码库,关于文章,可以看构思到实现RemoveButterKnife 原因近期想给原来的插件RemoveButterKnife加入一些新的功能,发现以前的代码没...

项目的升级-给RemoveButterKnife插件增加新功能

项目的升级-给RemoveButterKnife插件增加新功能

前言经过项目的初步编写和进一步改造,RemoveButterKnife插件终于也有模有样了,但是,功能上仅仅支持Activity/Fragment的BindView注解。 关于编写和优化的过程可以看下面两篇文章项目构造RemoveButterKnife 项目改进-重构RemoveButterKn...

Android测试体系-在MVVM架构中如何测试Model层与ViewModel层

背景此文章是对于google code lab中《Introduction to Test Double and Dependence injection》 与 《Testing Basics》的总结,本篇主要讲述如何在mvvm架构的android项目中对Model层以及ViewModel层进行测试...

使用Databinding为Recyclerview使用同一个ViewHolder加载不同Item

提示:在阅读本篇文章前,你最好对android databinding有一定了解,本文使用的代码均为kotlin,但是不用担心,都很简单 最近在写项目的时候使用了databinding技术,突发奇想,databinding是不是也能应用于recyclerview中,让加载多个不同的item更简单呢...

自己实现一个Android网络图片加载器

在Android开发中,我们经常会用到各种各样的图片加载框架来帮助我们加载网络图片,那有没有想过自己实现一个呢 本文记录了实现一个图片框架的整个流程,以及对代码的优化整理过程,文章比较长,如果只对其中的一部分感兴趣直接跳转到相应部分即可 提问环节把大象装进冰箱分几步?是不是感觉在这初秋时节更加凉...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。