Spinner选中项变更时清除ArrayList旧值并添加适配血型的方案
解决安卓Spinner切换血型时ArrayList旧值残留的问题
我来帮你搞定这个问题!你遇到的核心问题有两个:一是判断逻辑里存在无效的重复条件,导致移除操作根本不会执行;二是切换血型时没有先清空旧的集合内容,而是试图手动移除条目,这不仅麻烦还容易出错。
问题分析
- 重复的条件判断:你看每个血型的
if和else if条件完全相同,比如A+的判断里,if (matchedGrpToDonate.equals("A+"))之后又写了else if (matchedGrpToDonate.equals("A+")),这就导致else if里的移除代码永远不会被执行到,完全是无效代码。 - 未清空旧集合:当用户从O-切换到A-时,你没有先把之前O-添加的所有血型清空,而是试图去移除,但代码里根本没有处理这种跨血型切换的移除逻辑,就算有,手动移除也很容易遗漏或者出错。
解决方案
最简单可靠的办法就是每次处理新血型前,先清空集合,然后直接添加当前血型对应的可捐赠列表,这样就不用管之前的内容了,逻辑清晰还不容易出错。同时我们可以优化判断逻辑,让代码更整洁。
基础修复版本
修改matchedBloodGroups方法,先清空集合再添加新内容:
private void matchedBloodGroups() { // 关键步骤:先清空旧的集合内容 bloodBankCanDonate.clear(); if (matchedGrpToDonate.equals("A+")) { bloodBankCanDonate.add("AB+"); bloodBankCanDonate.add("A+"); } else if (matchedGrpToDonate.equals("A-")) { bloodBankCanDonate.add("AB+"); bloodBankCanDonate.add("A+"); bloodBankCanDonate.add("AB-"); bloodBankCanDonate.add("A-"); } else if (matchedGrpToDonate.equals("B+")) { bloodBankCanDonate.add("AB+"); bloodBankCanDonate.add("B+"); } else if (matchedGrpToDonate.equals("B-")) { bloodBankCanDonate.add("AB+"); bloodBankCanDonate.add("B+"); bloodBankCanDonate.add("AB-"); bloodBankCanDonate.add("B-"); } else if (matchedGrpToDonate.equals("O+")) { bloodBankCanDonate.add("AB+"); bloodBankCanDonate.add("A+"); bloodBankCanDonate.add("B+"); bloodBankCanDonate.add("O+"); } else if (matchedGrpToDonate.equals("O-")) { bloodBankCanDonate.add("AB+"); bloodBankCanDonate.add("A+"); bloodBankCanDonate.add("B+"); bloodBankCanDonate.add("O+"); bloodBankCanDonate.add("AB-"); bloodBankCanDonate.add("A-"); bloodBankCanDonate.add("B-"); bloodBankCanDonate.add("O-"); } // 打印结果验证 System.out.println("hash" + bloodBankCanDonate); }
优化版本(更易维护)
用Map存储血型与可捐赠列表的映射关系,后续修改或扩展血型规则时只需调整Map即可:
// 在类中定义全局映射,一次性初始化所有血型规则 private static final Map<String, List<String>> BLOOD_DONATION_MAP = new HashMap<>(); static { BLOOD_DONATION_MAP.put("A+", Arrays.asList("AB+", "A+")); BLOOD_DONATION_MAP.put("A-", Arrays.asList("AB+", "A+", "AB-", "A-")); BLOOD_DONATION_MAP.put("B+", Arrays.asList("AB+", "B+")); BLOOD_DONATION_MAP.put("B-", Arrays.asList("AB+", "B+", "AB-", "B-")); BLOOD_DONATION_MAP.put("O+", Arrays.asList("AB+", "A+", "B+", "O+")); BLOOD_DONATION_MAP.put("O-", Arrays.asList("AB+", "A+", "B+", "O+", "AB-", "A-", "B-", "O-")); } private void matchedBloodGroups() { bloodBankCanDonate.clear(); // 从映射中获取当前血型对应的可捐赠列表 List<String> donateList = BLOOD_DONATION_MAP.get(matchedGrpToDonate); if (donateList != null) { bloodBankCanDonate.addAll(donateList); } System.out.println("hash" + bloodBankCanDonate); }
效果说明
修改后,不管用户如何切换Spinner中的血型,每次都会先清空bloodBankCanDonate集合,再添加当前选中血型对应的适配血型,彻底解决旧值残留的问题。
内容的提问来源于stack exchange,提问作者user12556987
相关产品推荐
相关产品推荐

