Kotlin列表视图通过自定义适配器仅展示匹配类别的食品条目
分类过滤功能实现的修改点汇总
一、先修复影响代码编译的基础错误
- 修正
Food实体类的定义问题
原实体类存在属性大小写不匹配、冗余初始化逻辑、缺失Adapter依赖字段的问题,直接简化为Kotlin标准数据类写法:
原代码问题说明:之前定义的属性data class Food( val name: String, val kindOfFood: String, val price: Double )KinOfFood首字母大写,和构造参数的kindOfFood大小写不一致,init块实际是给不存在的属性赋值;同时代码中未定义price字段,但Adapter读取item.price会直接触发编译错误,需要补上该字段。 - 修正食品集合添加逻辑的语法错误
原代码中沙拉对应的字符串缺失闭合双引号,且因为补上了price属性,添加条目时需要补全字段值:val food: ArrayList<Food> = ArrayList() food.add(Food("My Dish", "pizza", 68.0)) food.add(Food("My Dish 02", "salad", 32.0)) - 修正跳转传参的拼写错误
原intentOpc方法中把参数foodType错写为fodType,导致传参时找不到变量,修正为:private fun intentOpc(foodType: String) { val intent = Intent(this, MenuList::class.java) intent.putExtra("FOODNAME", foodType) startActivity(intent) } - 修正自定义Adapter的类型不匹配问题
原Adapter构造参数声明的泛型为ArrayList<Platillo>,和实际传入的Food类型不兼容,修改为:class MenuAdapter(var context: Context, items: ArrayList<Food>): BaseAdapter() { // 原有ViewHolder、getView等逻辑保持不变,冗余的items初始化逻辑可按需简化 }
二、添加核心分类过滤逻辑
所有过滤操作在把数据传给Adapter之前完成,不需要改动Adapter的内部展示逻辑:
- 在
MenuList页面的初始化阶段,先从Intent取出传递的分类参数:// 写在MenuList的onCreate方法中 val targetFoodType = intent.getStringExtra("FOODNAME") ?: "" - 获取全量食品集合后,用
filter方法筛选出分类匹配的条目,生成最终要展示的集合:// 拿到你的全量食品数据源 val fullFoodList = 你的全量食品集合获取逻辑 // 执行过滤,可加trim、统一小写处理避免字符串格式问题导致匹配失败 val filteredList = fullFoodList.filter { food -> food.kindOfFood.trim().lowercase() == targetFoodType.trim().lowercase() } as ArrayList<Food> // 把过滤后的集合传给Adapter完成初始化 menuList视图控件的id.adapter = MenuAdapter(this, filteredList)
补充说明:这种实现方式保持了Adapter的单一职责,Adapter只负责按传入的集合渲染列表,过滤逻辑集中在页面数据准备阶段,逻辑清晰不容易出错。如果后续需要动态切换分类更新列表,可以给Adapter加一个更新数据集的方法,重新传入过滤后的集合后调用
notifyDataSetChanged()即可。
内容的提问来源于stack exchange,提问作者jotaro-gogogo
相关产品推荐
相关产品推荐

