【Jetpack Compose基础语法学与练】第15课 LazyRow横向滚动列表、简单搜索过滤列表实战

发布时间:2026/10/9 7:44:54

【Jetpack Compose基础语法学与练】第15课 LazyRow横向滚动列表、简单搜索过滤列表实战 前言本节课学习 LazyRow 横向懒加载滚动列表并且结合TextField输入框实现列表搜索过滤实战。复习Lazy系列懒加载DSL、remember状态练习数据源过滤。知识点清单LazyRow横向懒加载滚动列表对比LazyColumn纵向列表item{}、items{}、itemsIndexed{} 在LazyRow中的用法TextField文本输入维护搜索关键字状态Kotlin集合filter()过滤数据源实现实时搜索过滤之后渲染懒加载列表状态驱动页面更新完整示例源码ComposablefunLazyRowSearchDemoPage(){//原始完整数据源valoriginDatalistOf(Java,Kotlin,Dart,Rust,Go,C,C#,Swift,Cangjie,Python)//保存搜索框输入文本varsearchKeywordbyremember{mutableStateOf()}// 根据关键字实时过滤数据源valfilterResultremember(searchKeyword){originData.filter{item-item.contains(searchKeyword,ignoreCasetrue)}}Column(modifierModifier.fillMaxSize().padding(20.dp),verticalArrangementArrangement.spacedBy(16.dp)){TextField(valuesearchKeyword,onValueChange{searchKeywordit},placeholder{Text(请输入搜索语言名称)},modifierModifier.fillMaxWidth())Text(text横向热门语言LazyRow,fontSize18.sp,fontWeightFontWeight.Medium)LazyRow(horizontalArrangementArrangement.spacedBy(12.dp)){items(filterResult){name-Card(modifierModifier.height(80.dp),elevationCardDefaults.cardElevation(4.dp)){Text(textname,modifierModifier.padding(horizontal16.dp).wrapContentHeight(Alignment.CenterVertically),fontSize17.sp)}}}Text(text纵向过滤结果LazyColumn,fontSize18.sp,fontWeightFontWeight.Medium)LazyColumn(modifierModifier.weight(1f).fillMaxWidth(),verticalArrangementArrangement.spacedBy(10.dp)){items(filterResult){name-Card(modifierModifier.fillMaxWidth()){Text(textname,modifierModifier.padding(14.dp),fontSize17.sp)}}}}}逐行解读LazyRow横向懒加载LazyRow水平方向滚动的懒加载容器对应LazyColumn垂直滚动。DSL语法和LazyColumn完全一样支持 item{} 、 items{} 、 itemsIndexed{} 。horizontalArrangement.spacedBy(12.dp) 设置横向条目之间的间距。remember(key){ } 带依赖key的记忆remember(searchKeyword) 当searchKeyword发生变化的时候会重新执行大括号内的过滤逻辑searchKeyword不变的时候直接复用上一次过滤结果避免不必要重复计算。filter集合过滤 ignoreCase truecontains(searchKeyword, ignoreCase true) 忽略大小写匹配输入小写也可以匹配大写的文本。Modifier.weight(1f)LazyColumn设置weight(1f)在Column垂直布局里面占掉剩余屏幕高度防止列表挤压上面搜索框与横向LazyRow。容易踩坑❌ LazyRow内部同样必须使用item / items DSL不可以直接写组件。❌ 过滤数据源一定要写remember(依赖关键字)否则每次重组都会反复执行filter造成不必要计算。❌ 在Column里面直接给LazyColumn写fillMaxSize会布局异常使用 weight(1f) 分配剩余高度。✅ 搜索过滤不要修改原始集合基于原始数据源filter得到新的过滤后集合。多元化习题每道题后紧跟答案解读习题1【基础‑改错题】题目找出下面LazyRow代码错误并修复LazyRow(){Card(){Text(测试1)}Card(){Text(测试2)}}答案LazyRow(){items(listOf(测试1,测试2)){str-Card(){Text(str)}}}解读LazyRow属于懒加载DSL域不能直接放置CardUI条目必须包裹在item{}或者items{}内部语法规则与LazyColumn完全一致。习题2【基础‑代码修改题】题目在示例横向LazyRow的最前面增加一个头部卡片文本【热门】只显示一次。答案LazyRow(horizontalArrangementArrangement.spacedBy(12.dp)){item{Card(elevationCardDefaults.cardElevation(4.dp)){Text(热门,modifierModifier.padding(16.dp).wrapContentHeight(Alignment.CenterVertically),fontSize17.sp)}}items(filterResult){name-Card(modifierModifier.height(80.dp),elevationCardDefaults.cardElevation(4.dp)){Text(textname,modifierModifier.padding(horizontal16.dp).wrapContentHeight(Alignment.CenterVertically),fontSize17.sp)}}}解读横向列表的头部依然使用 item{} 单独渲染item块渲染单个元素不参与循环放在items前面。LazyRow和LazyColumn的DSL接口完全统一。习题3【进阶‑补充代码题】题目当filterResult过滤之后结果为空没有搜索匹配项纵向LazyColumn上方显示提示文本“未查询到匹配数据”。写出该item片段。答案LazyColumn(modifierModifier.weight(1f).fillMaxWidth(),verticalArrangementArrangement.spacedBy(10.dp)){if(filterResult.isEmpty()){item{Text(未查询到匹配数据,modifierModifier.padding(20.dp),fontSize18.sp,colorColor.Gray)}}items(filterResult){name-Card(modifierModifier.fillMaxWidth()){Text(textname,modifierModifier.padding(14.dp),fontSize17.sp)}}}解读可以直接在Lazy的DSL里面写if分支当过滤后的集合为空的时候渲染提示item有数据就直接渲染items条目实现空状态提示。习题4【综合‑逻辑应用题】题目改造搜索逻辑要求搜索的时候区分大小写不再忽略大小写同时如果搜索关键字为空字符串纵向列表只展示前5条数据。书写remember过滤块代码。答案valfilterResultremember(searchKeyword){if(searchKeyword.isEmpty()){originData.take(5)}else{originData.filter{item-item.contains(searchKeyword)}}}解读去掉 ignoreCasetrue 之后contains就严格区分大小写take(5)截取集合前5个元素利用remember(searchKeyword)绑定关键字作为依赖关键字变化重新执行筛选逻辑。习题5【概念简答题】题目LazyRow与LazyColumn异同是什么答案相同点都属于懒加载组件拥有视图复用DSL语法item、items、itemsIndexed完全一致。不同点LazyRow是水平方向滚动LazyColumn是垂直方向滚动布局方向不一样间距属性一个horizontalArrangement一个verticalArrangement。解读LazyRow适合横向滑动的标签、分类LazyColumn适合长垂直数据列表开发的时候根据产品UI滚动方向选型。本节课知识点总结LazyRow横向懒加载滚动列表和LazyColumn一样具备条目复用适合横向滑动展示标签、分类。LazyRow与LazyColumn共享同一套DSL语法item{}单独条目items{}循环渲染。remember(key){ } 可以添加状态依赖当key对应的值改变块内逻辑重新运算用于数据源过滤。搜索过滤业务原则保留原始数据源基于原始集合filter生成过滤结果集合不要修改原集合。在Column嵌套LazyColumn的时候LazyColumn优先使用 Modifier.weight(1f) 来分配剩余可用高度避免布局报错。下一课预告第16课 Scaffold脚手架、TopAppBar顶部导航栏实战
延伸阅读

更多相关文章

2026/10/9 7:44:54

嵌入式传感器时间戳对齐:从错位曲线到微秒级同步

/* 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 10:06:02

Cocos Creator 3.x 3D拼图开发:核心机制与性能优化

老板把需求丢给我的时候,我正盯着满屏的“羊了个羊”竞品分析发愁。他说得没错,2D拼图市场是真的卷——换皮、联名、剧情化、番外篇,你能想到的姿势同行都试过了。但他下一句话才是重点:“你去做个3D版本的吧。”这句话听着像脑洞…

2026/10/9 10:06:02

JS原生API实战排障指南:DOM、事件、异步与存储的坑与解

1. 这份JSAPI总结不是“复习资料”,而是我压箱底的现场排障手册“JS基础 JSAPI 总结”——看到这个标题,你脑子里浮现的是不是那种密密麻麻罗列document.getElementById、addEventListener、JSON.parse的速查表?我以前也这么干过。在某次紧急…

2026/10/9 10:06:02

uvue 跨端开发实战:原生渲染与 Vue 语法融合的性能优化指南

1. 跨端开发的新选择:uvue 到底解决了什么问题第一次在项目里接触 uvue 是在一个需要同时覆盖移动端和桌面端的跨平台项目上。当时团队已经用惯了传统的 uni-app 方案,Vue 语法写起来顺手,但一遇到复杂列表滚动、长页面渲染,webvi…

2026/10/9 10:06:02

轻量级中文文本分析:词频统计与倒排索引实战

1. 项目概述:为什么一个看似简单的“词频排序关键字搜索”值得花一整天认真拆解这个词组听起来像大学数据结构课的课后习题——统计一段文字里每个词出现多少次,再按次数从高到低排个序;接着用户输入一个词,程序快速告诉你它在哪几…

2026/10/9 10:06:02

带头结点单链表实战:可调试、防越界、支持泛型的C++线性表实现

简介:本资源是北京邮电大学数据结构课程首次实验的完整线性表实践报告,面向计算机类本科生及算法初学者,聚焦带头结点单链表的原理实现与工程验证。内容涵盖存储结构解析(逻辑/物理次序差异、指针域设计)、9大核心算法…

2026/10/9 10:01:00

开源项目“代码泥潭”生存指南:从选型到排查的实战避坑手册

开源项目这事儿,真得是“没进去之前是围城,进去之后是泥潭”。我在技术圈摸爬滚打了十几年,从最初只会在 GitHub 上点 Star、看热闹,到后来正儿八经把开源项目集成到生产环境,再到自己也维护过几个不上不下的小项目&am…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* 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 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑