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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:45:14