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
相关产品推荐
相关产品推荐

