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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:37:29