前言
Android 列表分页加载组件 paging3 alpha版本已经出来很久了。目前到了alpha7;
分享一下在项目中使用的经验和坑;不讲原理和源码,纯使用经验分享!
(不要问我为啥把alpha版本用在项目中,问就是任性,问就是paging2太难用了)
准备工作
1.依赖:
本文撰写日期:2020-10-21;最新版为3.0.0-alpha07
//java
implementation 'androidx.paging:paging-runtime:3.0.0-alpha07'
//kotlin
implementation 'androidx.paging:paging-runtime-ktx:3.0.0-alpha07'
根据语言二选一即可,我使用的是kotlin;
使用:
1.adapter
使用paging3 ,RecyclerView的adapter 必须继承 PagingDataAdapter
因为后续分页的UI和操作都归于 adapter 管理;
adpater 构造必须传参数 DiffUtil.ItemCallback ;
用过 AsyncListDiffer 的小伙伴应该明白它的作用;
不明白的可以参考一下这篇文章:Android AsyncListDiffer-RecyclerView最好的伙伴
DiffUtil.ItemCallback 简单介绍:
DiffUtil.ItemCallback的作用就是取代notifyDataSetChanged粗暴刷新列表的;
毕竟粗暴刷新比较消耗性能;
主要介绍三个方法:
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean {}
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean {}
override fun getChangePayload(oldItem: T, newItem: T): Any? {}
paging3的设计理念是不建议对列表数据直接修改;而是对数据源进行操作,数据源的变化会自动更新到列表;
DiffUtil.ItemCallback 就是用来比对数据变化,从而决定更新对应UI;并执行条目动画;
areItemsTheSame
比对新旧条目是否是同一个条目;
一般比对条目的唯一标示id即可,谨慎对待,如果条目不同则可能不会更新UI;
areContentsTheSame
当上面的方法确定是同一个条目之后,这里比对条目的内容是否一样,不一样则会更新条目UI
建议这里的比对把UI展示的数据都写上,写漏了会导致UI不更新对应字段;
getChangePayload (可选)
这个方法对应 RcyclerView的 adapter的 第三个参数;用于条目内部的局部刷新;
override fun onBindViewHolder(
holder: RecyclerView.ViewHolder,
position: Int,
payloads: MutableList
)
2.数据请求处理
这里利用知乎日报的接口作为范例:
没有使用到paging3的数据库缓存方案 remoteMediator;因为参数被注解为