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

Android RecyclerView:实现同一行EditText内容同步至TextView的问题

问题分析与修改方案

核心问题梳理

  1. MainActivity中FAB逻辑冗余错误:点击FAB时新建EditText并获取文本完全没必要,此时EditText为空,直接添加空数据的Product即可。
  2. ViewHolder构造函数中的错误循环:遍历整个列表并拼接所有项的文本到当前项的TextView,导致每个新项的TextView都包含之前所有项的内容。
  3. 未实时刷新UI:EditText内容变更后更新了Model,但未同步更新同一行的TextView,也没通知适配器刷新当前位置。
  4. 静态列表导致数据混乱:适配器中productsList设为static,会引发列表复用和数据同步问题。
  5. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:55:30