Android ListView ViewHolder点击单个条目时多个条目被修改如何解决
问题原因
该问题是ListView的View复用机制导致的:你仅在点击时修改了当前条目的UI颜色,没有将选中状态存储到对应的数据实体中,当条目被滑出屏幕复用时,之前修改的颜色状态会被带到新加载的条目上,就会出现点击一个条目多个条目同步变色的问题。
解决步骤
1. 修改ClassListItems实体类,新增选中状态字段
public class ClassListItems { private String name; private String code; private String stock; // 新增选中状态标记,默认未选中 private boolean isSelected = false; public ClassListItems(String name, String code, String stock) { this.name = name; this.code = code; this.stock = stock; } // 原有getName、getCode、getStock方法保持不变,新增以下两个方法 public boolean isSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } }
2. 调整适配器getView方法的绑定逻辑
每次加载条目时都根据数据的选中状态设置文本颜色,避免复用残留状态:
// 原有设置商品名称、编码、库存的代码保持不变,新增颜色判断逻辑 if (parkingList.get(position).isSelected()) { viewHolder.textName.setTextColor(Color.GREEN); } else { // 还原为布局默认的黑色,和你布局里配置的默认颜色保持一致即可 viewHolder.textName.setTextColor(Color.BLACK); }
3. 修改条目点击事件逻辑
不要直接修改ViewHolder的UI属性,而是修改对应位置的数据状态,再通知适配器刷新:
rowView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 原有弹出底部弹窗、读取商品信息的逻辑保持不变 BottomSheetDialog bottomSheet = new BottomSheetDialog(); bottomSheet.show(getSupportFragmentManager(), "ModalBottomSheet"); String name,code; double amount; name = finalViewHolder.textName.getText().toString(); code = finalViewHolder.textCode.getText().toString(); amount = Double.parseDouble(finalViewHolder.edtAmount.getText().toString()); OrfLine orfLine = new OrfLine(); orfLine.setName(name); System.out.println("ProductList : "+ orfLine.getName()); orfLine.setCode(code); orfLine.setAmount(amount); // 修改当前点击条目对应数据的选中状态 parkingList.get(position).setSelected(true); // 如果需要支持点击取消选中,可以改成下面的取反逻辑 // parkingList.get(position).setSelected(!parkingList.get(position).isSelected()); // 通知适配器刷新列表 notifyDataSetChanged(); } });
内容的提问来源于stack exchange,提问作者fatosis
相关产品推荐
相关产品推荐

