如何获取RecyclerView中所有EditText的数据并传递至其他Activity
解决RecyclerView中多EditText数值获取的方案
嘿,我来帮你搞定这个RecyclerView里EditText取值的问题!既然你已经有了EntryData类,那咱们就基于它来实现,核心思路是把EditText的输入实时同步到对应的EntryData对象中,这样最后不需要逐个查找EditText,直接遍历数据列表就能拿到所有输入值,还能方便地做数学运算。
步骤1:完善EntryData类
确保你的EntryData类包含存储两个EditText数值的字段,以及对应的Getter/Setter方法,方便后续读写数据:
public class EntryData implements Serializable { // 实现Serializable方便跨Activity传递 private double value1; private double value2; public EntryData() { // 初始化默认值为0.0 this.value1 = 0.0; this.value2 = 0.0; } // Getter方法 public double getValue1() { return value1; } public double getValue2() { return value2; } // Setter方法 public void setValue1(double value1) { this.value1 = value1; } public void setValue2(double value2) { this.value2 = value2; } }
步骤2:改造RecyclerView Adapter,实时同步输入值
在Adapter里给每个EditText添加TextWatcher,用户输入时自动把数值同步到对应的EntryData对象里,这样数据和UI就绑定在一起了:
public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.EntryViewHolder> { private List<EntryData> entryList; public EntryAdapter(List<EntryData> entryList) { this.entryList = entryList; } @NonNull @Override public EntryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_entry, parent, false); // 替换成你的条目布局ID return new EntryViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull EntryViewHolder holder, int position) { EntryData currentEntry = entryList.get(position); // 设置EditText初始值 holder.etValue1.setText(String.valueOf(currentEntry.getValue1())); holder.etValue2.setText(String.valueOf(currentEntry.getValue2())); // 监听第一个EditText的输入 holder.etValue1.addTextChangedListener(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) { try { // 转换为double,空输入则设为0.0 double inputValue = s.length() > 0 ? Double.parseDouble(s.toString()) : 0.0; currentEntry.setValue1(inputValue); } catch (NumberFormatException e) { // 输入无效数字时设为0.0,也可以在这里给用户提示 currentEntry.setValue1(0.0); } } }); // 监听第二个EditText的输入,逻辑和上面一致 holder.etValue2.addTextChangedListener(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) { try { double inputValue = s.length() > 0 ? Double.parseDouble(s.toString()) : 0.0; currentEntry.setValue2(inputValue); } catch (NumberFormatException e) { currentEntry.setValue2(0.0); } } }); } @Override public int getItemCount() { return entryList.size(); } // ViewHolder类 public static class EntryViewHolder extends RecyclerView.ViewHolder { EditText etValue1, etValue2; public EntryViewHolder(@NonNull View itemView) { super(itemView); etValue1 = itemView.findViewById(R.id.et_value1); // 替换成你的EditText ID etValue2 = itemView.findViewById(R.id.et_value2); // 限制输入为小数数字 etValue1.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); etValue2.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); } } }
步骤3:在主Activity中管理数据和跳转
在主Activity里维护一个全局的EntryData列表,添加条目时往列表里新增对象,点击提交按钮时直接遍历列表获取所有数值,再传递到目标Activity:
public class MainActivity extends AppCompatActivity { private List<EntryData> entryList = new ArrayList<>(); private EntryAdapter entryAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化RecyclerView RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); entryAdapter = new EntryAdapter(entryList); recyclerView.setAdapter(entryAdapter); // 添加条目按钮点击事件 Button btnAddEntry = findViewById(R.id.btn_add_entry); btnAddEntry.setOnClickListener(v -> { entryList.add(new EntryData()); entryAdapter.notifyItemInserted(entryList.size() - 1); }); // 提交按钮点击事件 Button btnSubmit = findViewById(R.id.btn_submit); btnSubmit.setOnClickListener(v -> { // 遍历列表获取所有数值,做你需要的数学运算 double totalResult = 0.0; for (EntryData entry : entryList) { // 示例:把每个条目的两个值相加后累加 totalResult += entry.getValue1() + entry.getValue2(); } // 传递数据到另一个Activity Intent intent = new Intent(MainActivity.this, TargetActivity.class); intent.putExtra("TOTAL_CALCULATION", totalResult); // 如果需要传递整个条目列表,直接传Serializable对象 // intent.putExtra("ALL_ENTRIES", (Serializable) entryList); startActivity(intent); }); } }
小提示
- 如果需要把整个EntryData列表传递到另一个Activity,一定要让EntryData实现
Serializable或者Parcelable接口,上面的代码已经用了Serializable,简单易用。 - 可以在TextWatcher的异常捕获里添加Toast提示,告诉用户输入了无效数字,提升体验。
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

