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

如何用单个按钮保存RecyclerView中所有EditText的数据?

实现RecyclerView全局按钮一次性保存所有EditText数据

问题背景

现有一个包含EditText的RecyclerView,原本每个Item对应独立的“保存”按钮,点击时将EditText值存入ArrayList,通过Adapter的getInput()方法读取。现在需要改为用单个全局按钮一次性保存所有EditText的数据。

解决方案核心思路

  1. 用数据类绑定Item数据:利用已有的Bien类作为数据源载体,每个EditText的输入直接同步到对应Bien对象的属性中,避免单独维护输入列表。
  2. 实时同步EditText输入:在Adapter的ViewHolder中监听EditText的文本变化,实时更新对应位置的Bien对象。
  3. 全局按钮直接读取数据源:点击全局按钮时,直接从Adapter获取更新后的完整数据源列表即可。

修改后的完整代码

1. MainActivity 修改

public class MainActivity extends AppCompatActivity {
    private RecyclerView recycler;
    private Button boton;
    // 改用Bien对象列表作为数据源
    private ArrayList<Bien> bienList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        boton = findViewById(R.id.boton);
        recycler = findViewById(R.id.recycler);
        recycler.setLayoutManager(new LinearLayoutManager(this));

        // 初始化数据源
        for(int i = 0; i < 7; i++){
            bienList.add(new Bien("Hola", 0.0));
        }

        Adapter adapter = new Adapter(bienList);
        recycler.setAdapter(adapter);

        // 全局按钮点击事件:获取所有EditText数据
        boton.setOnClickListener(view -> {
            ArrayList<Bien> updatedList = adapter.getUpdatedBienList();
            for(Bien bien : updatedList){
                Log.i("保存的数据", "名称:" + bien.getNombre());
            }
        });
    }
}

2. Adapter 修改

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    private ArrayList<Bien> bienList;

    public Adapter(ArrayList<Bien> bienList) {
        this.bienList = bienList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.itemlist, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Bien currentBien = bienList.get(position);
        holder.nombre.setText(currentBien.getNombre());
        // 绑定当前位置,用于文本变化时更新对应数据
        holder.bindPosition(position);
    }

    @Override
    public int getItemCount() {
        return bienList.size();
    }

    // 提供方法获取更新后的完整数据源
    public ArrayList<Bien> getUpdatedBienList() {
        return bienList;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        EditText nombre;
        int currentPosition;

        public ViewHolder(View itemView) {
            super(itemView);
            nombre = itemView.findViewById(R.id.nombre);
            
            // 监听EditText文本变化,实时更新对应Bien对象
            nombre.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) {
                    if (currentPosition != -1 && s != null) {
                        bienList.get(currentPosition).setNombre(s.toString());
                    }
                }

                @Override
                public void afterTextChanged(Editable s) {}
            });
        }

        // 绑定当前Item的位置
        public void bindPosition(int position) {
            this.currentPosition = position;
        }
    }
}

3. itemlist.xml 修改(移除单个保存按钮)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp">

    <EditText
        android:id="@+id/nombre"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
</LinearLayout>

4. Bien类(保持原有结构即可)

public class Bien {
    private String nombre;
    private double valor;

    public Bien(String nombre, double valor) {
        this.nombre = nombre;
        this.valor = valor;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }
}

代码说明

  • 移除了每个Item的独立保存按钮,改为实时同步EditText输入到数据源对象。
  • 全局按钮点击时,直接从Adapter获取更新后的bienList,里面已经包含所有EditText的最新输入值。
  • 避免了静态列表可能导致的内存泄漏和数据混乱问题,数据管理更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:27:12