使用ArrayAdapter运行时展示无重复字符串及出现次数的问题求助
解决Android Adapter展示重复字符串及次数的问题
你的问题核心在于把数据去重和统计的逻辑放错了地方,而且当前的代码逻辑本身就有漏洞,导致无法实现无重复列表的需求。我来一步步帮你修正:
为什么你的现有代码不生效?
- 错误的数据源修改时机:在
getView方法里直接修改data列表是大忌——getView会被ListView/RecyclerView频繁调用,每次调用都修改数据源会导致数据错乱,重复元素只会越来越多。 - 逻辑判断完全失效:
!data.contains(data.get(position))这个条件永远为false,因为data.get(position)本来就是data里的元素,所以你写的去重逻辑根本不会执行。 - 次数统计逻辑冗余:
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
相关产品推荐
相关产品推荐

