Android开发 Spinner下拉列表加载数据出现重复值问题
Spinner下拉列表重复值问题排查结果
问题原因
- 代码中原本用于去重的HashMap存储逻辑被注释,直接将接口返回的所有
Sm条目对应的运营商名称、金额原样存入数组传给Spinner适配器,只要返回的列表中存在同运营商、同金额的条目,Spinner就会展示重复值。 - 从日志可以看到
smsListItem被多次打印,需确认loadSmsData方法是否存在重复调用的情况,若每次调用都叠加数据未清空旧列表,也会导致重复值。 - 接口返回的
Sm列表本身可能存在业务层面的重复属性:不同Sm对象的运营商名称、金额字段值完全相同,属于正常业务场景,必须做去重处理。
修复方案
替换loadSmsData方法中else分支的数据源处理逻辑,使用LinkedHashSet做去重同时保留条目顺序,示例代码如下:
else { // 改用LinkedHashSet存储,自动去重且保留插入顺序 LinkedHashSet<String> operatorSet = new LinkedHashSet<>(); LinkedHashSet<String> amountSet = new LinkedHashSet<>(); for (int x = 0; x < size; x++) { long amount = smsListitem.get(x).getPrice(); Network network = smsListitem.get(x).getNetwork(); phoneNum = smsListitem.get(x).getShortcode().toString(); amountSet.add(String.valueOf(amount)); if (LngID == 0) { operatorSet.add(network.getAr()); } else if (LngID == 1) { operatorSet.add(network.getEn()); } } // 转成列表适配Spinner List<String> operatorList = new ArrayList<>(operatorSet); List<String> amountList = new ArrayList<>(amountSet); ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, operatorList); operspiner.setAdapter(adapter); ArrayAdapter<String> adapteramount = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, amountList); amountspiner.setAdapter(adapteramount); // 原有选中监听逻辑保持不变,注意如果需要匹配原始Sm对象,不要直接用position索引原始smsListitem,需通过选中值匹配对应条目 amountspiner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { SpinerItemAmount = amountspiner.getSelectedItem().toString(); post = position; } public void onNothingSelected(AdapterView<?> parent) { } }); }
额外检查项:确认每次请求接口更新smsListitem时,是否先调用了clear()清空旧数据再添加新返回的条目,避免列表数据重复叠加。
内容的提问来源于stack exchange,提问作者Mahmoud Al-Haroon
相关产品推荐
相关产品推荐

