You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:53