Android:如何获取RecyclerView中动态创建的EditText的值?
解决方案:获取RecyclerView动态EditText值并生成指定格式JSON
要解决这个问题,核心思路是在Adapter内部维护一份和列表项对应的响应数据,实时同步用户对EditText的输入和CheckBox的选中操作,最后通过Adapter提供的方法让Activity获取这些数据,再处理成要求的格式转换为JSON。下面是具体实现步骤:
1. 定义响应数据模型
先创建两个数据类,分别存储单个选项的响应和整个问题的响应,让数据管理更清晰:
// 单个选项的响应数据 public class OptionResponse { private String optionText; // CheckBox显示的文本 private String inputValue; // EditText的输入值 private boolean isChecked; // CheckBox是否被选中 // 构造函数 public OptionResponse(String optionText, String inputValue, boolean isChecked) { this.optionText = optionText; this.inputValue = inputValue; this.isChecked = isChecked; } // Getter和Setter方法 public String getOptionText() { return optionText; } public void setOptionText(String optionText) { this.optionText = optionText; } public String getInputValue() { return inputValue; } public void setInputValue(String inputValue) { this.inputValue = inputValue; } public boolean isChecked() { return isChecked; } public void setChecked(boolean checked) { isChecked = checked; } } // 单个问题的响应数据 public class QuestionResponse { private String questionId; // 问题ID private List<OptionResponse> optionResponses; // 该问题下所有选项的响应集合 // 构造函数 public QuestionResponse(String questionId, List<OptionResponse> optionResponses) { this.questionId = questionId; this.optionResponses = optionResponses; } // Getter和Setter方法 public String getQuestionId() { return questionId; } public void setQuestionId(String questionId) { this.questionId = questionId; } public List<OptionResponse> getOptionResponses() { return optionResponses; } public void setOptionResponses(List<OptionResponse> optionResponses) { this.optionResponses = optionResponses; } }
2. 在Adapter中维护响应数据并实时更新
在你的RecyclerView Adapter中添加响应列表,初始化时和原始问题列表一一对应,然后修改TextWatcher和CheckBox点击事件来实时同步数据:
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> { private Activity activity; private List<YourQuestionModel> arrayList; private List<QuestionResponse> mQuestionResponses; // 新增:存储所有响应数据 // 构造函数:初始化响应列表 public YourAdapter(Activity activity, List<YourQuestionModel> arrayList) { this.activity = activity; this.arrayList = arrayList; this.mQuestionResponses = new ArrayList<>(); // 为每个问题初始化响应数据(默认未选中,输入值为空) for (YourQuestionModel question : arrayList) { List<OptionResponse> optionResponses = new ArrayList<>(); for (String option : question.getOptionList()) { optionResponses.add(new OptionResponse(option, "", false)); } mQuestionResponses.add(new QuestionResponse(question.getQuestionID(), optionResponses)); } } // ... 保留原有代码(ViewHolder定义、onCreateViewHolder、onBindViewHolder等) private void populateCheckBoxWithText(ViewHolder viewHolder, int position) { int ctr = 1; YourQuestionModel currentQuestion = arrayList.get(position); List<OptionResponse> currentOptionResponses = mQuestionResponses.get(position).getOptionResponses(); for (final String optionAns : currentQuestion.getOptionList()) { CheckBox cBoxOption = new CheckBox(activity); cBoxOption.setId(ctr); cBoxOption.setTag(ctr); cBoxOption.setText(optionAns); // 初始化CheckBox选中状态 cBoxOption.setChecked(currentOptionResponses.get(ctr - 1).isChecked()); Custom_EditText_Regular editext_miltiple = new Custom_EditText_Regular(activity); editext_miltiple.setId(ctr); editext_miltiple.setTag(ctr); editext_miltiple.setTextSize(12); // 初始化EditText输入值 editext_miltiple.setText(currentOptionResponses.get(ctr - 1).getInputValue()); // ... 保留原有布局参数、样式设置代码 viewHolder.sub_item.addView(cBoxOption); viewHolder.sub_item.addView(editext_miltiple); // 更新CheckBox选中状态的点击事件 cBoxOption.setOnClickListener(v -> { int optionIndex = (int) cBoxOption.getTag() - 1; currentOptionResponses.get(optionIndex).setChecked(cBoxOption.isChecked()); }); // 更新EditText输入值的TextWatcher editext_miltiple.addTextChangedListener(new GenericTextWatcher(position, ctr - 1)); ctr++; } } // 自定义TextWatcher,实时同步EditText输入值到响应数据 private class GenericTextWatcher implements TextWatcher { private int questionPosition; private int optionIndex; public GenericTextWatcher(int questionPosition, int optionIndex) { this.questionPosition = questionPosition; this.optionIndex = optionIndex; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { // 更新对应选项的输入值 mQuestionResponses.get(questionPosition) .getOptionResponses() .get(optionIndex) .setInputValue(s.toString().trim()); } } // 新增:提供给Activity获取所有响应数据的公共方法 public List<QuestionResponse> getQuestionResponses() { return mQuestionResponses; } }
3. 在Activity中获取数据并生成JSON
当需要提交数据到服务器时,从Adapter获取响应数据,按照CheckBoxValue<>EditTextValue的格式整理,再转换为JSON:
// 获取RecyclerView的Adapter实例 YourAdapter adapter = (YourAdapter) yourRecyclerView.getAdapter(); if (adapter == null) return; List<QuestionResponse> responses = adapter.getQuestionResponses(); JSONArray finalJsonArray = new JSONArray(); try { for (QuestionResponse questionResp : responses) { JSONObject questionObj = new JSONObject(); questionObj.put("question_id", questionResp.getQuestionId()); JSONArray optionResponsesArray = new JSONArray(); for (OptionResponse optionResp : questionResp.getOptionResponses()) { // 只处理选中的选项(如果需要收集全部选项,可去掉此判断) if (optionResp.isChecked()) { String formattedStr = optionResp.getOptionText() + "<>" + optionResp.getInputValue(); optionResponsesArray.put(formattedStr); } } questionObj.put("responses", optionResponsesArray); finalJsonArray.put(questionObj); } } catch (JSONException e) { e.printStackTrace(); } // 转换为JSON字符串,即可发送给服务器 String jsonRequest = finalJsonArray.toString();
关键说明
- 实时同步:通过TextWatcher和CheckBox点击事件,确保响应数据和用户操作完全同步,不会丢失输入或选中状态
- 职责分离:响应数据由Adapter独立维护,Activity只负责获取和转换,符合组件化的设计原则
- 可扩展性:如果后续需要添加更多字段(比如选项ID),只需修改数据模型即可快速适配
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

