Android RecyclerView:实现同一行EditText内容同步至TextView的问题
问题分析与修改方案
核心问题梳理
- MainActivity中FAB逻辑冗余错误:点击FAB时新建EditText并获取文本完全没必要,此时EditText为空,直接添加空数据的
Product即可。 - ViewHolder构造函数中的错误循环:遍历整个列表并拼接所有项的文本到当前项的TextView,导致每个新项的TextView都包含之前所有项的内容。
- 未实时刷新UI:EditText内容变更后更新了Model,但未同步更新同一行的TextView,也没通知适配器刷新当前位置。
- 静态列表导致数据混乱:适配器中
productsList设为static,会引发列表复用和数据同步问题。 - onBindViewHolder未正确绑定TextView:没有将Model中的
name设置到同一行的txtsave。
修改后的代码
MainActivity.java
public class MainActivity extends AppCompatActivity { FloatingActionButton fab; RecyclerView recyclerView; ArrayList<Product> productsList; CustomAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.rec); recyclerView.setLayoutManager(new LinearLayoutManager(this)); productsList = new ArrayList<>(); adapter = new CustomAdapter(MainActivity.this, productsList); recyclerView.setAdapter(adapter); fab = findViewById(R.id.fabBtn); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 用列表长度作为唯一ID,添加空内容的Product productsList.add(new Product(productsList.size(), "")); adapter.notifyItemInserted(productsList.size() - 1); } }); } }
CustomAdapter.java
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { private ArrayList<Product> productsList; private Context context; public CustomAdapter(Context context, ArrayList<Product> productsList) { this.context = context; this.productsList = productsList; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.layout_rv, viewGroup, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder viewHolder, final int position) { Product product = productsList.get(position); viewHolder.idtxt.setText(String.valueOf(product.getId())); // 绑定EditText和TextView的初始值 viewHolder.textView.setText(product.getName()); viewHolder.txtsave.setText(product.getName()); } @Override public int getItemCount() { return productsList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { TextView idtxt; EditText textView; TextView txtsave; public ViewHolder(@NonNull View itemView) { super(itemView); idtxt = itemView.findViewById(R.id.idttxt); textView = itemView.findViewById(R.id.textView); txtsave = itemView.findViewById(R.id.txtsave); textView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { int currentPos = getAdapterPosition(); if (currentPos != RecyclerView.NO_POSITION) { // 更新Model数据 productsList.get(currentPos).setName(charSequence.toString()); // 实时同步到同一行的TextView txtsave.setText(charSequence.toString()); } } @Override public void afterTextChanged(Editable editable) {} }); } } }
关键修改说明
- FAB逻辑简化:直接添加空内容的
Product,用列表长度作为ID保证唯一性,移除多余的EditText创建逻辑。 - 移除静态列表:避免不同适配器实例间的数据干扰,保证每个适配器持有独立的列表数据。
- TextWatcher优化:增加位置合法性判断,更新Model的同时直接同步同一行的TextView,实现实时显示;避免RecyclerView复用引发的异常。
- 完善数据绑定:在
onBindViewHolder中正确绑定EditText和TextView的初始值,保证列表项复用时数据正确。 - 删除错误循环:移除ViewHolder构造中遍历整个列表的逻辑,解决TextView内容累加的问题。
内容的提问来源于stack exchange,提问作者Abm
相关产品推荐
相关产品推荐

