如何用单个按钮保存RecyclerView中所有EditText的数据?
实现RecyclerView全局按钮一次性保存所有EditText数据
问题背景
现有一个包含EditText的RecyclerView,原本每个Item对应独立的“保存”按钮,点击时将EditText值存入ArrayList,通过Adapter的getInput()方法读取。现在需要改为用单个全局按钮一次性保存所有EditText的数据。
解决方案核心思路
- 用数据类绑定Item数据:利用已有的
Bien类作为数据源载体,每个EditText的输入直接同步到对应Bien对象的属性中,避免单独维护输入列表。 - 实时同步EditText输入:在Adapter的ViewHolder中监听EditText的文本变化,实时更新对应位置的
Bien对象。 - 全局按钮直接读取数据源:点击全局按钮时,直接从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
相关产品推荐
相关产品推荐

