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

Android动态创建多问题Checkbox并校验选中状态实现求助

动态创建Checkbox的选中校验实现方案

现有代码问题

  • 同组Checkbox ID重复:chk.setId(checkBoxJSONOpt.length()); 会导致同一问题下所有多选框ID完全一致,无法单独区分
  • 没有按问题分组存储多选框:所有Checkbox统一存入allViewInstance,校验时无法识别哪些选项属于同一道题
  • 未存储问题必填属性:接口返回的IsRequired字段没有和对应问题关联,校验时不知道哪些题需要做非空判断
  • 缺少选中状态的关联统计逻辑,无法快速判断某道题是否有选中项

优化实现步骤

1. 定义问题关联实体类

首先新增实体类存储每道题的完整信息,方便后续校验和取值:

public class SurveyQuestion {
    // 问题唯一标识
    private int registerFieldId;
    // 问题标题
    private String questionName;
    // 是否为必填题
    private boolean isRequired;
    // 该问题下所有多选框实例
    private List<CheckBox> optionCheckBoxList;

    // 自行补充Getter、Setter方法
}

2. 修改动态创建Checkbox的逻辑

替换原有创建代码,修正ID设置、按问题分组存储数据:

// 全局声明列表,存储页面所有问卷问题
List<SurveyQuestion> surveyQuestionList = new ArrayList<>();

// 原有遍历每道题的逻辑内,新增如下代码
JSONArray checkBoxJSONOpt = eachData.getJSONArray("lstRegisterOptions");
// 初始化当前题实体
SurveyQuestion currentQuestion = new SurveyQuestion();
currentQuestion.setRegisterFieldId(eachData.getInt("RegisterFieldId"));
currentQuestion.setQuestionName(eachData.getString("Name"));
currentQuestion.setRequired(eachData.getBoolean("IsRequired"));
List<CheckBox> currentChkList = new ArrayList<>();

for (int j = 0; j < checkBoxJSONOpt.length(); j++) {
    CheckBox chk = new CheckBox(SurveyDetailsActivity.this);
    chk.setBackgroundColor(Color.parseColor("#FFFFFF"));
    // 用选项唯一ID作为Checkbox ID,避免重复
    chk.setId(checkBoxJSONOpt.getJSONObject(j).getInt("RegisterOptionId"));
    chk.setTag(checkBoxJSONOpt.getJSONObject(j).getString("QOption"));
    chk.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
    chk.setTextColor(ContextCompat.getColor(SurveyDetailsActivity.this, R.color.textchoice));
    chk.setPadding(0, 0, 0, 0);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    params.topMargin = 3;
    params.bottomMargin = 3;
    String optionString = checkBoxJSONOpt.getJSONObject(j).getString("QOption");
    chk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            chk.setError(null);
            String variant_name = v.getTag().toString();
        }
    });
    chk.setText(optionString);
    viewProductLayout.addView(chk, params);
    currentChkList.add(chk);
}
currentQuestion.setOptionCheckBoxList(currentChkList);
surveyQuestionList.add(currentQuestion);

3. 提交前校验逻辑

表单提交前调用该方法,返回true则校验通过,返回false则存在未完成的必答题:

private boolean checkCheckBoxValid() {
    for (SurveyQuestion question : surveyQuestionList) {
        // 仅校验必填的多选问题
        if (question.isRequired()) {
            boolean hasChecked = false;
            // 遍历该题所有选项,判断是否有选中项
            for (CheckBox chk : question.getOptionCheckBoxList()) {
                if (chk.isChecked()) {
                    hasChecked = true;
                    break;
                }
            }
            // 无选中项则抛出错误提示
            if (!hasChecked) {
                CheckBox firstChk = question.getOptionCheckBoxList().get(0);
                firstChk.setError("该题为必答题,请至少选择一个选项");
                firstChk.requestFocus();
                return false;
            }
        }
    }
    return true;
}

补充优化说明

  • 若需要收集用户选中的结果,遍历每道题的optionCheckBoxList,将isChecked()为true的选项值汇总即可
  • 若存在最多选N个的自定义校验规则,可在实体类新增对应规则字段,校验时增加对应判断逻辑即可

内容的提问来源于stack exchange,提问作者Dinesh Vatti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:27:04