|
|
做了个"外卖菜单选择器"App,才发现ListView和Spinner的区别这么大
上周帮家里的小餐馆做了个点餐原型App,需求很简单:顾客能在手机上浏览菜品列表、点选想要的菜。本以为拖几个组件就完事,结果在"用什么组件展示列表"这个问题上卡了整整两个小时——ListView还是Spinner?看着都差不多,实际用起来差别真不小。
需求分析
餐馆老板(也就是我妈)的要求:
• 菜品按分类展示,至少30道菜
• 顾客能快速找到想吃的菜(最好能搜索)
• 选好后能看到当前选了哪道
• 操作步骤越少越好,中老年顾客也得会用
这本质就是一个列表展示+选择的需求。App Inventor 2里能做这件事的组件,主要有两个:ListView(列表显示框)和Spinner(下拉框)。还有个ListPicker(列表选择器)也算近亲,但交互方式不太一样。
技术方案
我最终选了两个都用:顶部一个Spinner做"菜品分类"筛选,下方一个ListView展示该分类下的具体菜品。这个组合在原生Android应用里非常经典,App Inventor 2完全可以做到。
先说说这三个组件的核心区别:
Spinner(下拉框):点击后弹出下拉菜单,选中一项后收起,界面只显示当前选中值。适合选项数量有限、需要节省空间的场景。属性上通过元素字串(逗号分隔)或元素(列表)来设置选项,选择完成事件返回用户的选择。
ListView(列表显示框):直接在界面上展示一整列项目,支持文本、图像甚至多行布局。选项多的时候可以滚动浏览,还内置搜索框。元素属性接受列表数据,v2.74版本后还支持添加项目、删除索引处项目等动态操作方法。
ListPicker(列表选择器):看起来像个按钮,点击后弹出全屏列表供选择。功能上和Spinner类似,但展示方式不同——它弹出的是独立列表界面而非下拉菜单。
对于我的点餐App来说:
• 分类只有"热菜/凉菜/汤品/主食/饮品"5项 → Spinner完美适配
• 每个分类下菜品数量不等,可能十几二十道 → ListView更合适,还能开搜索框
关键实现
Step 1: 界面搭建
在Screen1上放一个水平布局,里面嵌一个Spinner和一个Label(显示"请选择分类"提示)。Spinner下方放一个ListView,宽度填满,高度设为占满剩余空间。
Step 2: 初始化分类数据
屏幕初始化事件中,设置Spinner的元素字串为"热菜,凉菜,汤品,主食,饮品"。同时用一个全局变量菜品数据存储所有菜品,结构是用字典嵌套列表:
{
"热菜": ["红烧肉", "糖醋排骨", "鱼香肉丝", ...],
"凉菜": ["凉拌黄瓜", "口水鸡", ...],
...
}
Step 3: Spinner联动ListView
Spinner的选择完成事件里,拿到选中项(分类名称),从菜品数据字典中取出对应的列表,赋值给ListView的元素属性。核心积木就是:
当 Spinner1.选择完成:
设 ListView1.元素 为 取字典值(全局菜品数据, Spinner1.选中项)
这样用户选择"热菜",ListView立刻刷新显示所有热菜。
Step 4: 记录用户选择
ListView的选择完成事件触发时,选中项属性就是用户点的菜名。把它加到一个已点列表全局变量里,并在底部Label显示当前已选数量。
Step 5: 搜索功能
ListView有个显示搜索框属性,勾上就行。30道菜的名字一长,搜索框的价值立刻体现——Spinner没有这个能力,这也是我没用Spinner展示菜品列表的原因。
踩过的坑
坑1:ListView高度设为"填充父级"在可滚动屏幕上不生效。 文档里明确写了这个警告。解决办法是关掉Screen的允许滚动,或者给ListView一个固定高度值。
坑2:Spinner选中项的获取时机。 一开始我在Spinner的被点击事件里去读选中项,结果拿到的是上一次的值。正确做法是在选择完成事件里读取,这时候用户已经选好了新的项。
坑3:ListView的元素属性更新后界面没刷新。 老版本(v2.74之前)需要调用刷新()方法,新版本虽然删掉了这个方法,但直接设置元素属性就能自动更新。如果你用的是老版本的AI伴侣,可能还会遇到这个问题。
坑4:ListView的布局选择。 默认只显示文本,想每道菜旁边配一张图,需要在设计视图把布局属性改成"Image,MainText"之类的组合,然后用列表数据属性而非元素来传数据。这一步折腾了挺久,因为纯文本和图文混排的数据格式完全不同。
最终效果
App跑起来之后,我妈试用了一会儿,评价是"比纸质菜单好找"。她最满意的是搜索框——输入"鸡"就能把口水鸡、白切鸡、宫保鸡丁全筛出来。
Spinner负责分类切换,一秒跳转;ListView负责菜品浏览,空间充足还能滚动。两者搭配,整个点餐流程只需要两步操作:选分类→点菜。
复盘感悟
这次做点餐App最大的收获是:选组件不能只看功能,更要看交互场景。Spinner和ListView都能"展示列表让用户选",但:
• 选项少于7个、界面空间紧张 → 选Spinner
• 选项多、需要滚动或搜索 → 选ListView
• 想弹出一个独立选择界面 → 选ListPicker
把它们当成三种不同层次的交互工具,而不是三个可互换的"列表组件",就不会选错了。
|
|