You need to enable JavaScript to run this app. Android ListView ViewHolder点击单个条目时多个条目被修改如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:42:02