用DiffUtil高效管理ViewPager2中的Fragment:Android-Extensions FragmentListAdapter实战
用DiffUtil高效管理ViewPager2中的FragmentAndroid-Extensions FragmentListAdapter实战【免费下载链接】Android-ExtensionsAn Android library with modules to quickly bootstrap an Android application.项目地址: https://gitcode.com/gh_mirrors/an/Android-ExtensionsAndroid-Extensions是一个用于快速搭建 Android 应用的扩展库集合其中的FragmentListAdapter组件将DiffUtil差量刷新机制引入ViewPager2让你用一行submitList()就能高效管理滑动页面中的 Fragment彻底告别整页重建的性能陷阱。为什么 ViewPager2 中刷新全部Fragment 会卡顿用官方的FragmentStateAdapter管理 ViewPager2 时最常见的做法是数据一变就调用notifyDataSetChanged()。问题在于这会把 ViewPager2 里的所有页面全部销毁重建后果是 当前正在浏览的页面闪动动画和滚动状态丢失 Fragment 频繁创建销毁白白消耗 CPU 页面数量一多滑动开始掉帧根因在于位置被当成了身份。RecyclerView 早已用 DiffUtil 解决这个问题而 ViewPager2 底层恰恰就是 RecyclerView——它同样值得一次精准的差量更新。FragmentListAdapter基于 DiffUtil 的 ViewPager2 适配器FragmentListAdapter位于库的viewpager2模块源码文件为viewpager2/src/main/java/com/tunjid/viewpager2/FragmentListAdapter.kt模块说明见viewpager2/README.md。它的核心设计一句话就能讲清内部封装了AsyncListDiffer提交新数据后先在后台线程对比新旧列表只重建真正发生变化的页面未变的 Fragment 原地保留。⚡它有三个关键设计点FragmentTab接口每个页签都是一个有身份的对象而不再是一个孤立的 position 数字稳定的itemId由FragmentTab的类全名 hashCode()共同哈希生成保证页面身份在数据重排后依然稳定submitList(newTabs)一行代码提交新数据差量计算与 UI 更新自动完成实现 FragmentTab两个方法让页面拥有身份FragmentTab接口只有两个方法实现成本极低方法作用createFragment()告诉适配器该页要创建哪个 Fragmenttitle(res)提供页签标题配合 TabLayout 显示页签文字⚠️ 官方强烈建议用data class来实现FragmentTab至少要保证equals和hashCode稳定——DiffUtil 的整个比对逻辑就建立在这之上。实战案例3 行代码搭建 Doggo 滑动页 示例 App 中有一个完整的实战案例DoggoPagerFragment源码app/src/main/java/com/tunjid/androidx/tablists/doggo/DoggoPagerFragment.kt用该适配器渲染了 9 页狗狗图片配合自定义指示器实现点击小圆点跳转页面整体代码如下所示核心仅 3 行// 页签定义data class 保证身份稳定 private data class DoggoTab(val doggo: Doggo) : FragmentTab { override fun title(res: Resources) override fun createFragment() DoggoFragment.newInstance(doggo) } // 一行创建适配器 一行挂载到 ViewPager2 val adapter fragmentListAdapterOf(Doggos.map(::DoggoTab)) binding.viewPager.adapter adapter之后数据再怎么变化只需要adapter.submitList(newTabs)DiffUtil 会自动比对新旧列表只有真正变化的页面才会重建其余 Fragment 保持不动。另外fragmentListAdapterOf扩展函数在Fragment和FragmentActivity上都可用前者自动使用childFragmentManager后者使用supportFragmentManager生命周期也都已按最佳实践接好无需手动处理。进阶用 Diffable 接口精准控制差量粒度 FragmentListAdapter的比对逻辑由recyclerview模块的DiffAdapterCallback驱动源码recyclerview/src/main/java/com/tunjid/androidx/recyclerview/diff/DiffAdapterCallback.kt它可以感知Diffable接口定义于recyclerview/src/main/java/com/tunjid/androidx/recyclerview/diff/Differentiable.kt成员作用diffId判断是不是同一个条目——数据重排时只做移动不重建areContentsTheSame判断内容是否变化——避免无谓重建getChangePayload提供变化负载支持局部更新示例中的Doggo数据类源码app/src/main/java/com/tunjid/androidx/tablists/doggo/Doggo.kt就实现了Diffable以name拼接哈希作为diffId。这样一来即使把某只狗狗在列表中挪个位置ViewPager2 也只是移动了页面而不会销毁重建。接入指南3 步用上 FragmentListAdapter ✅第 1 步获取依赖。模块制品发布在 Maven Central在build.gradle中添加implementation com.tunjid.androidx:viewpager2:version也可以克隆源码仓库自行构建git clone https://gitcode.com/gh_mirrors/an/Android-Extensions第 2 步定义页签类型。为你的页面数据实现FragmentTab用 data class 承载业务数据即可。第 3 步挂载并刷新。在Fragment或FragmentActivity中调用fragmentListAdapterOf(initialTabs)创建适配器赋值给viewPager.adapter数据更新时统一走submitList(newTabs)。总结 FragmentListAdapterFragmentStateAdapterAsyncListDiffer DiffUtil为 ViewPager2 提供差量刷新能力FragmentTab用 data class 实现让每个页面拥有稳定身份是差量比对生效的前提数据更新只需submitList()一行从此告别notifyDataSetChanged的整页重建需要更精细的差量控制时让数据模型实现recyclerview模块的Diffable接口如果你的项目里 ViewPager2 页面越来越多、数据越来越动态这个组件值得放进你的工具箱。【免费下载链接】Android-ExtensionsAn Android library with modules to quickly bootstrap an Android application.项目地址: https://gitcode.com/gh_mirrors/an/Android-Extensions创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ipwhois返回结果字段速查:一文读懂RDAP与Legacy Whois的完整数据结构

ipwhois返回结果字段速查:一文读懂RDAP与Legacy Whois的完整数据结构

ipwhois返回结果字段速查:一文读懂RDAP与Legacy Whois的完整数据结构 【免费下载链接】ipwhois Retrieve and parse whois data for IPv4 and IPv6 addresses 项目地址: https://gitcode.com/gh_mirrors/ip/ipwhois ipwhois 是一款专注于 IPv4 与 IPv6 whois…

2026/8/22 15:24:20 阅读更多 →
如何10分钟部署TeslaLogger:树莓派镜像烧录与首次上电完整教程

如何10分钟部署TeslaLogger:树莓派镜像烧录与首次上电完整教程

如何10分钟部署TeslaLogger:树莓派镜像烧录与首次上电完整教程 【免费下载链接】TeslaLogger TeslaLogger is a self hosted data logger for your Tesla Model S/3/X/Y. Actually it supports RaspberryPi 3B, 3B, 4B, Docker and Synology NAS. 项目地址: https…

2026/8/22 15:24:20 阅读更多 →
深入Total.js Flow架构:可视化编程FlowStream子进程隔离与definitions启动流程完整解读

深入Total.js Flow架构:可视化编程FlowStream子进程隔离与definitions启动流程完整解读

深入Total.js Flow架构:可视化编程FlowStream子进程隔离与definitions启动流程完整解读 【免费下载链接】flow Visual Programming Interface 项目地址: https://gitcode.com/gh_mirrors/flow29/flow Total.js Flow 是一个构建在 Total.js v5 之上的开源**可…

2026/8/22 15:24:20 阅读更多 →

最新新闻

如何用 WebGLInput 三步跑通 Unity WebGL 输入法:新手避坑完整指南

如何用 WebGLInput 三步跑通 Unity WebGL 输入法:新手避坑完整指南

如何用 WebGLInput 三步跑通 Unity WebGL 输入法:新手避坑完整指南 【免费下载链接】WebGLInput IME for Unity WebGL 项目地址: https://gitcode.com/gh_mirrors/we/WebGLInput WebGLInput 是一个面向 Unity WebGL 平台的开源输入法(IME&#xf…

2026/8/22 15:56:27 阅读更多 →
PS1 存档如何管理?MemcardRex 记忆卡编辑完整指南

PS1 存档如何管理?MemcardRex 记忆卡编辑完整指南

PS1 存档如何管理?MemcardRex 记忆卡编辑完整指南 【免费下载链接】memcardrex Advanced PlayStation 1 Memory Card editor 项目地址: https://gitcode.com/gh_mirrors/me/memcardrex MemcardRex 是一款 PS1 记忆卡管理工具,覆盖记忆卡文件打开、…

2026/8/22 15:55:27 阅读更多 →
点了停止,模型为什么还可能继续跑

点了停止,模型为什么还可能继续跑

按钮、浏览器、SSE 服务和上游模型,是四个不同的停止边界。 摘要| 我沿 Microi吾码当前 AI 流式链路,从停止按钮追到 AbortController、SSE、服务端和上游调用。结论:点击停止可结束浏览器读取;只有取消信号继续穿过服…

2026/8/22 15:55:27 阅读更多 →
DM在水平分区表建立索引:提升大数据环境下查询性能的关键技术

DM在水平分区表建立索引:提升大数据环境下查询性能的关键技术

一、DM水平分区表建立索引概述 1.1 DM数据库分区表的基本概念 DM数据库作为中国自主研发的数据库管理系统,其分区表技术允许将大型表数据分散存储在多个物理分区中,从而提高数据管理效率和查询性能。水平分区表是指按照特定条件将表的数据行划分到不同的…

2026/8/22 15:55:27 阅读更多 →
她把最后一颗种子送进风暴:18秒如何讲清选择与代价

她把最后一颗种子送进风暴:18秒如何讲清选择与代价

一颗种子、一个拉杆、一次个人记忆的熄灭:18秒只保留能改变世界的动作。 摘要| 《风眼种库》是一支原创18秒横屏电影短片:风暴逼近,21岁亚洲成年种库工程师必须在保住个人档案与重启城市清洁空气核心之间选择。她拉下释放杆&#…

2026/8/22 15:55:27 阅读更多 →
ComfyUI-VideoHelperSuite 教程:5步把AI图像序列变成能分享的视频

ComfyUI-VideoHelperSuite 教程:5步把AI图像序列变成能分享的视频

ComfyUI-VideoHelperSuite 教程:5步把AI图像序列变成能分享的视频 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 你刚生成的16张连续帧还躺在输出目录…

2026/8/22 15:54:27 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →