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

使用ArrayAdapter运行时展示无重复字符串及出现次数的问题求助

解决Android Adapter展示重复字符串及次数的问题

你的问题核心在于把数据去重和统计的逻辑放错了地方,而且当前的代码逻辑本身就有漏洞,导致无法实现无重复列表的需求。我来一步步帮你修正:

为什么你的现有代码不生效?

  1. 错误的数据源修改时机:在getView方法里直接修改data列表是大忌——getView会被ListView/RecyclerView频繁调用,每次调用都修改数据源会导致数据错乱,重复元素只会越来越多。
  2. 逻辑判断完全失效:!data.contains(data.get(position))这个条件永远为false,因为data.get(position)本来就是data里的元素,所以你写的去重逻辑根本不会执行。
  3. 次数统计逻辑冗余:Collections.frequency(data, a)统计的是整个列表里的总次数,但因为原列表有重复元素,每个重复项都会显示相同的次数,导致列表还是重复的。

正确的解决方案:先处理数据,再适配展示

我们应该先在数据源层面完成去重+次数统计,再把处理后的数据交给Adapter展示,而不是在Adapter里做数据处理。

步骤1:创建数据实体类(可选但更清晰)

定义一个简单的实体类来存储唯一字符串和对应的出现次数:

public class ProductCodeCount {
    public String code;
    public int count;

    public ProductCodeCount(String code, int count) {
        this.code = code;
        this.count = count;
    }
}

步骤2:在Activity中处理原始数据

把你拿到的重复字符串列表,转换成包含唯一元素和次数的列表:

// 假设这是你从别处拿到的原始重复字符串列表
List<String> originalData = getOriginalData();

// 用HashMap统计每个字符串的出现次数
Map<String, Integer> countMap = new HashMap<>();
for (String code : originalData) {
    // 存在则次数+1,不存在则初始化为1
    countMap.put(code, countMap.getOrDefault(code, 0) + 1);
}

// 转换为Adapter需要的List<ProductCodeCount>
List<ProductCodeCount> uniqueData = new ArrayList<>();
for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
    uniqueData.add(new ProductCodeCount(entry.getKey(), entry.getValue()));
}

步骤3:修改Adapter适配处理后的数据

现在的Adapter只需要负责展示处理好的数据,不需要再做任何数据逻辑:

public class AdapterProductCode extends ArrayAdapter<ProductCodeCount> {
    private Context context;
    private int layoutResourceId;
    private List<ProductCodeCount> data;

    // 构造方法接收处理后的去重数据
    public AdapterProductCode(Context context, int layoutResourceId, List<ProductCodeCount> data) {
        super(context, layoutResourceId, data);
        this.context = context;
        this.layoutResourceId = layoutResourceId;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        // 复用View优化性能
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(layoutResourceId, parent, false);
            holder = new ViewHolder();
            holder.txtLeft = convertView.findViewById(R.id.txtLeft); // 替换成你的TextView ID
            holder.txtRight = convertView.findViewById(R.id.txtRight); // 替换成你的TextView ID
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // 直接取出处理好的元素和次数展示
        ProductCodeCount item = data.get(position);
        holder.txtLeft.setText(item.code);
        holder.txtRight.setText(String.valueOf(item.count));

        return convertView;
    }

    // ViewHolder静态类,避免重复查找控件
    static class ViewHolder {
        TextView txtLeft;
        TextView txtRight;
    }
}

步骤4:在Activity中设置Adapter

最后把处理好的数据传给Adapter,设置给ListView即可:

AdapterProductCode adapter = new AdapterProductCode(this, R.layout.your_item_layout, uniqueData);
yourListView.setAdapter(adapter);

这样就能得到一个完全无重复的列表,每个元素旁边显示对应的出现次数了。

内容的提问来源于stack exchange,提问作者StanGa E-med

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:35:57