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

如何获取RecyclerView中EditText的值并存储到ArrayList集合?

实现方案

你需要解决的核心问题是RecyclerView的视图复用机制导致直接遍历EditText容易拿错数据,我们通过实时监听输入同步到集合的方式实现,避免数据丢失:


第一步 修复现有代码小问题

你现有的JSON解析代码存在数组越界风险,先改这部分:
把TestText.java中JSON遍历的代码

for (int i=0;i<= jsonArray.length();i++)

修改为

for (int i=0;i< jsonArray.length();i++)

第二步 改造HelperAdapterForTest

新增输入回调接口,监听每个EditText的输入变化回传给Activity:

import android.text.Editable;
import android.text.TextWatcher;
import android.text.TextUtils;
// 其余原有导入不变

public class HelperAdapterForTest extends RecyclerView.Adapter<HelperAdapterForTest.MyViewClass>
{
    // 原有变量不变
    private OnAnswerInputListener answerInputListener;

    // 新增回调接口
    public interface OnAnswerInputListener {
        void onAnswerInput(int position, Integer inputValue);
    }

    // 构造方法新增回调参数
    public HelperAdapterForTest(ArrayList< String > id,ArrayList< String >  question, ArrayList< String > possible_answer1,ArrayList< String > possible_answer2,ArrayList< String > possible_answer3,ArrayList< String > answer,Context context, OnAnswerInputListener listener) {
        this.id = id;
        this.question = question;
        this.possible_answer1 = possible_answer1;
        this.possible_answer2 = possible_answer2;
        this.possible_answer3 = possible_answer3;
        this.answer=answer;
        this.context = context;
        this.answerInputListener = listener;
    }

    @Override
    public void onBindViewHolder(@NonNull HelperAdapterForTest.MyViewClass holder, @SuppressLint("RecyclerView") int position) {
        // 先移除旧的监听器,避免复用导致数据错乱
        if (holder.answer.getTag() instanceof TextWatcher) {
            holder.answer.removeTextChangedListener((TextWatcher) holder.answer.getTag());
        }

        // 原有赋值逻辑不变
        holder.id.setText(id.get(position));
        holder.question.setText(question.get(position));
        holder.possible_answer1.setText(possible_answer1.get(position));
        holder.possible_answer2.setText(possible_answer2.get(position));
        holder.possible_answer3.setText(possible_answer3.get(position));

        // 新增输入监听
        TextWatcher watcher = new TextWatcher() {
            @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) {
                Integer input = -1; // 未输入默认值可自定义
                try {
                    if (!TextUtils.isEmpty(s)) {
                        input = Integer.parseInt(s.toString());
                    }
                } catch (NumberFormatException e) {
                    // 非数字输入的处理逻辑可自己补充
                }
                answerInputListener.onAnswerInput(position, input);
            }
        };
        holder.answer.addTextChangedListener(watcher);
        holder.answer.setTag(watcher);
    }
    // 其余原有代码不变
}

第三步 改造TestText Activity

初始化useranswer集合,接收Adapter回传的输入值:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_text);
    recyclerView = findViewById(R.id.recyclerviewtest);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(linearLayoutManager);

    Intent intent = getIntent();
    Context context=this;
    String fName = intent.getStringExtra("name");
    setTitle(fName);

    try {
        JSONObject jsonObject = new JSONObject(JsonDataFromAsset("tests.json"));
        JSONArray jsonArray = jsonObject.getJSONArray(fName);
        // 这里已经改了循环条件
        for (int i=0;i< jsonArray.length();i++){
            JSONObject userData=jsonArray.getJSONObject(i);
            id.add(userData.getString("id"));
            question.add(userData.getString("question"));
            possible_answer1.add(userData.getString("possible_answer1"));
            possible_answer2.add(userData.getString("possible_answer2"));
            possible_answer3.add(userData.getString("possible_answer3"));
            answer.add(userData.getString("answer"));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    // 先初始化useranswer,大小和题目数一致
    useranswer.clear();
    for (int i = 0; i < id.size(); i++) {
        useranswer.add(-1);
    }

    // 初始化Adapter的时候传入回调实现
    HelperAdapterForTest helperAdapter = new HelperAdapterForTest(id, question, possible_answer1, possible_answer2, possible_answer3, answer, TestText.this, new HelperAdapterForTest.OnAnswerInputListener() {
        @Override
        public void onAnswerInput(int position, Integer inputValue) {
            // 实时同步输入到useranswer集合
            if (position < useranswer.size()) {
                useranswer.set(position, inputValue);
            }
        }
    });
    recyclerView.setAdapter(helperAdapter);

    Button but=findViewById(R.id.verify_button);
    but.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 这里直接用已经填充好的useranswer即可
            for (int i = 0; i < useranswer.size(); i++) {
                // 后续可加校验、提交逻辑
                Log.d("用户答案", "第"+(i+1)+"题:"+useranswer.get(i));
            }
        }
    });
}
// 其余原有代码不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:36:02