如何获取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
相关产品推荐
相关产品推荐

