B07_RecyclerView复用与DiffUtil
Android 基础补强 B07RecyclerView复用的 View 为什么会带着上一条的状态摘要通过收藏标记串行和标题更新不显示两个问题区分 ViewHolder 复用、完整绑定、条目身份、内容比较及不可变列表提交。标签Android、RecyclerView、DiffUtil、ListAdapter、第一行代码本文对应《第一行代码》第 3 版第 4.6 节并补强 28 天课程 D17。RecyclerView 不只是“能滚动的数组”数据、条目 View、位置以及业务 ID 是不同概念。下面围绕同一份文章数据写传统列表示例未在你的工程编译布局与依赖需配套补齐。1. 复用复用的是容器不是文章身份文章滚出屏幕后它使用的 ViewHolder 可能被拿来展示另一篇文章。这样避免为所有记录长期创建一整套控件但旧控件上的文字、可见性、选中状态也会暂时保留。绑定新数据时如果只处理“已收藏时显示图标”却没处理“未收藏时隐藏图标”第二篇就可能继承第一篇的视觉状态。因此完整绑定必须让当前 View 的显示由当前模型决定。标题、作者、图标、可见性、背景、启用状态和点击行为都需要明确赋值。图片请求也要关联当前条目并处理占位与取消不能让上一张图的异步结果覆盖新条目。复用机制由 RecyclerView 组织正确绑定是 Adapter 的职责。RecyclerView 官方指南布局管理器决定条目如何排列Adapter 决定如何创建与绑定ViewHolder 保存条目引用。把这些角色分开之后切成网格主要改变布局安排不应该迫使网络请求或收藏逻辑全部重写。2. 同一篇文章也可能需要更新DiffUtil 的身份比较回答“这是不是同一条业务记录”通常使用文章 ID内容比较回答“显示相关的数据是否相同”。同一个 ID 的标题或收藏状态变化时身份相同、内容不同应该重新绑定。如果两个比较都只比较 ID条目就会看起来不更新。以下为简化的 ListAdapter假设启用 ViewBindingitem_article.xml生成ItemArticleBinding具有title、author、bookmarkIcon。依赖 RecyclerView 与 AndroidX Core 的isVisible扩展省略导包和宿主配置。dataclassArticleRow(valid:Long,valtitle:String,valauthor:String,valbookmarked:Boolean)classArticleAdapter(privatevalonClick:(Long)-Unit):ListAdapterArticleRow,ArticleAdapter.Holder(DIFF){classHolder(privatevalbinding:ItemArticleBinding):RecyclerView.ViewHolder(binding.root){funbind(row:ArticleRow,onClick:(Long)-Unit){binding.title.textrow.title binding.author.textrow.author binding.bookmarkIcon.isVisiblerow.bookmarked binding.root.isSelectedrow.bookmarked binding.root.setOnClickListener{onClick(row.id)}}}overridefunonCreateViewHolder(parent:ViewGroup,viewType:Int):Holder{valbindingItemArticleBinding.inflate(LayoutInflater.from(parent.context),parent,false)returnHolder(binding)}overridefunonBindViewHolder(holder:Holder,position:Int){holder.bind(getItem(position),onClick)}companionobject{valDIFFobject:DiffUtil.ItemCallbackArticleRow(){overridefunareItemsTheSame(old:ArticleRow,new:ArticleRow)old.idnew.idoverridefunareContentsTheSame(old:ArticleRow,new:ArticleRow)oldnew}}}这里把点击转换为业务 ID避免长期捕获绑定时的位置。位置可能因插入、删除而变化身份则代表目标文章。如果业务需要点击瞬间的最新数据可在回调后按 ID 从当前状态查询如果读取bindingAdapterPosition必须处理NO_POSITION不能未经检查直接当数组下标。old new依赖本例数据类字段恰好覆盖显示内容。若模型还包含不影响 UI 的内部字段可以定义更精确的内容比较若把展示字段藏在未参与比较的可变对象里则需要重新设计不然比较结果可能失真。DiffUtil API3. 提交新列表也要保持旧快照不变ListAdapter 会计算列表差异并分发更新。参与比较的旧列表和元素应保持不变更新收藏时使用map与copy生成新快照再提交。只在同一个 MutableList 内把字段改掉再提交原对象可能让差异计算失去“修改前”的证据。ListAdapter API示例更新可以写成adapter.submitList(rows.map { if (it.id target) it.copy(bookmarked true) else it })。真正业务应先更新 ViewModel 或 Repository由状态观察把新列表交给 Adapter而不是 Adapter 自己保存另一套永久收藏事实。差异更新与 View 复用解决不同成本。前者描述数据变化后者减少条目对象反复创建。notifyDataSetChanged()可以要求全面刷新却不能修复错误身份、原地修改或绑定遗漏也不应作为所有问题的默认补丁。4. 两个故障实验和一个顺序检查先准备二十条文章只收藏第一条。故意让绑定只在真分支显示收藏图标再向下滚动。预期复用后可能出现不该显示的标记。恢复无条件赋值后重复滚动预期每条显示都与模型一致。记录条目 ID 与 ViewHolder 标识可以观察相同容器如何服务不同文章。再让同 ID 文章改变标题先把内容比较错误地写成只比较 ID观察新标题不及时展示恢复完整内容比较后提交新快照预期只更新应变化的条目。最后在列表首部插入一条再点击原第三篇核对回调 ID 仍对应那篇文章而不是插入后的第三个位置。以上为实验设计与预期不是已运行报告。若某次现象没有出现应通过可控滚动和日志确认是否实际发生复用不能据一次截图宣布机制不存在。5. 原创面试问答与追问问一复用为什么会导致状态串到别的条目新绑定没有覆盖旧 View 的全部相关属性。追问销毁所有 View 能解决吗可能掩盖症状但失去复用收益正确做法是完整绑定。问二身份相同是否意味着内容相同不意味着同 ID 的标题和收藏状态都可能变化。追问比较内容时漏了收藏字段会怎样收藏变化可能无法触发应有更新。问三为什么不能把 position 当长期身份插入、删除、排序会改变它。追问点击要传什么通常传业务 ID再按需要读取最新模型读取当前位置时处理无效位置。上述为原创自测可配合面试鸭 RecyclerView 主题复述未照搬题库答案。6. 专题验收能解释创建、绑定、复用、差异计算各发生了什么完成快速滚动、同 ID 更新、首部插入后的点击检查更新数据时不修改旧快照。书本第 4.6 节提供列表起点本篇补上维护真实列表最常见的状态与身份问题再与 D17 的生命周期收集连接起来。

相关新闻

微信小程序蓝牙调试模板:从GATT服务发现到数据透传的完整实践

微信小程序蓝牙调试模板:从GATT服务发现到数据透传的完整实践

做蓝牙模组开发调试这些年,我最大的感受是:设备端写起来比调试端容易得多。拿到一块大夏龙雀蓝牙模组,第一件事不是焊板子,而是找个能快速跟它“对上话”的工具。传统做法是装串口助手、找官方App,但这些都有各自的问题…

2026/10/9 7:30:53 阅读更多 →
Silvaco TCAD器件建模:从PN结到CMOS的物理仿真原理与实操

Silvaco TCAD器件建模:从PN结到CMOS的物理仿真原理与实操

1. 项目概述:为什么在Silvaco中“制备”二极管、三极管与CMOS,本质是构建可仿真的物理模型在半导体器件仿真领域,“Silvaco二极管、三极管、CMOS的制备”这个标题里的“制备”二字,绝非指代洁净间里光刻、离子注入、退火的真实产线…

2026/10/7 20:25:36 阅读更多 →
039_高频注入法在凸极率较低电机上的适用边界

039_高频注入法在凸极率较低电机上的适用边界

039、高频注入法在凸极率较低电机上的适用边界 那个把电流环带宽推到3kHz的下午 前年冬天调一台表面贴装式永磁电机,转子磁钢是表贴的,凸极率大概只有1.05到1.1之间。当时项目要求零低速带载启动,编码器分辨率不够,供应商交期又压得紧,只能硬着头皮上高频注入。 按常规…

2026/10/7 20:25:36 阅读更多 →

最新新闻

编写恰到好处的产品退市(EOL)通知:Product-Manager-Skills 的 eol-message 技能实战指南

编写恰到好处的产品退市(EOL)通知:Product-Manager-Skills 的 eol-message 技能实战指南

AI 技能AI 插件 【免费下载链接】Product-Manager-Skills Product Management skills framework built on battle-tested methods for Claude Code, Cowork, Codex, and AI agents. 项目地址: https://gitcode.com/gh_mirrors/pr/Product-Manager-Skills 点击查看 免…

2026/10/9 7:31:10 阅读更多 →
用面试转录预测 Culture Index 特质:interpreting-culture-index 的 predict-from-interview 工作流实战指南

用面试转录预测 Culture Index 特质:interpreting-culture-index 的 predict-from-interview 工作流实战指南

AI 技能AI 插件应用安全网络安全AI 评测 【免费下载链接】skills Trail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows 项目地址: https://gitcode.com/gh_mirrors/skills8/skills 点击查看 免费下载 本文是 T…

2026/10/9 7:31:10 阅读更多 →
遗传算法求解电力系统经济调度:爬坡约束与网损的Matlab实现

遗传算法求解电力系统经济调度:爬坡约束与网损的Matlab实现

搞电力系统优化的同行应该都有同感:经济调度(Economic Dispatch)这个题目看起来不难——把负荷分给几台机组让总成本最低,但一旦把爬坡约束、网损这些工程细节塞进去,"简单"就变成了"复杂"。尤其是…

2026/10/9 7:31:10 阅读更多 →
Arcane 贡献指南:搭建 Go + SvelteKit 双端热重载开发环境并提交高质量 PR

Arcane 贡献指南:搭建 Go + SvelteKit 双端热重载开发环境并提交高质量 PR

云原生运维容器运行时 【免费下载链接】arcane Modern Docker Management, Designed for Everyone 项目地址: https://gitcode.com/gh_mirrors/arcane2/arcane 点击查看 免费下载 Arcane 是一个面向所有人的现代化 Docker 管理平台,采用 Go 后端、Svelt…

2026/10/9 7:31:10 阅读更多 →
wp-calypso 的 createSelector 详解:用 @automattic/state-utils 构建带缓存失效机制的 Redux 记忆化选择器

wp-calypso 的 createSelector 详解:用 @automattic/state-utils 构建带缓存失效机制的 Redux 记忆化选择器

前端CMS 【免费下载链接】wp-calypso The JavaScript and API powered WordPress.com 项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso 点击查看 免费下载 wp-calypso(WordPress.com 的前端应用)的 Redux 状态树刻意保持精简&#…

2026/10/9 7:31:10 阅读更多 →
Playnite 主题改 3 处 XAML 就能加动画

Playnite 主题改 3 处 XAML 就能加动画

Playnite 主题改 3 处 XAML 就能加动画 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: https://gitcode.com/GitHub_T…

2026/10/9 7:30:09 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →