如何去除ArrayList<HashMap<String,String>>重复元素?Retrofit数据重复问题
解决ArrayList显示重复的问题
嘿,我一眼就看到你代码里的关键问题了——你复用了同一个全局的hashmap对象!这才是导致重复显示的根源,咱们一步步来解决:
先搞定根本问题:别复用同一个HashMap对象
你把HashMap<String,String> hashmap定义成了全局变量,在循环遍历接口返回的data时,只是不断修改这个同一个对象的键值对,然后把它添加到list里。这就意味着list里的所有元素其实都是指向同一个HashMap实例——你每次添加的不是新数据,而是同一个对象的引用。最终要么所有元素都变成最后一次循环的内容,要么就像你logcat里显示的重复条目(本质都是引用重复导致的)。
修复方法很简单:把HashMap的创建放到循环内部,每次循环都生成一个全新的HashMap:
public void displayList(){ list.clear(); WebserviceAPI apiService =retrofit.create(WebserviceAPI.class); Call<OrderDetailsResponse> call = apiService.displayOrder("orderdetails",token_acces,id_order); call.enqueue(new Callback<OrderDetailsResponse>() { @Override public void onResponse(Call<OrderDetailsResponse> call, Response<OrderDetailsResponse> response) { OrderDetailsResponse result = response.body(); List<OrderDetails> data=result.getData(); returnstatus=result.isStatus(); msg= result.getMessage(); if(returnstatus){ for (OrderDetails a: data){ // 每次循环都新建一个HashMap,避免引用重复 HashMap<String,String> hashmap = new HashMap<String, String>(); hashmap.put(FIRST_COLUMN, a.getProduct_name()); hashmap.put(SECOND_COLUMN, a.getProduct_quantity()); hashmap.put(THIRD_COLUMN, a.getOriginal_product_price()); list.add(hashmap); Log.d("ressorder",""+list); } adapter=new ListViewAdapter(getActivity(), list); listView.setAdapter(adapter); } } @Override public void onFailure(Call<OrderDetailsResponse> call, Throwable t) { Log.d("fragerr",""+t.getMessage()); progress.dismiss(); } }); }
这样每个添加到list的都是独立的HashMap,不会再出现引用重复的问题。
如果接口真的返回了重复数据,再手动去重
要是修复后还是有重复,那大概率是接口返回的data列表本身就包含重复的OrderDetails对象。这时候可以用两种方法去重:
方法1:用LinkedHashSet保持顺序去重
LinkedHashSet会自动剔除重复元素,还能保留原来的插入顺序,之后再转回ArrayList就行:
// 循环添加完所有HashMap后执行 LinkedHashSet<HashMap<String, String>> uniqueSet = new LinkedHashSet<>(list); list.clear(); list.addAll(uniqueSet); // 重新设置适配器 adapter=new ListViewAdapter(getActivity(), list); listView.setAdapter(adapter);
方法2:手动遍历判断去重
如果你不想用Set,也可以手动遍历list,用一个临时集合存已经出现过的元素,只添加没出现过的:
ArrayList<HashMap<String, String>> uniqueList = new ArrayList<>(); for (HashMap<String, String> map : list) { if (!uniqueList.contains(map)) { uniqueList.add(map); } } list.clear(); list.addAll(uniqueList); // 更新适配器 adapter=new ListViewAdapter(getActivity(), list); listView.setAdapter(adapter);
这里要说明下:HashMap的contains方法是基于键值对的完全匹配来判断是否重复的,所以这个判断是有效的。
最后总结
先把HashMap的创建移到循环内部,这是解决你当前问题的核心。如果还有重复,再考虑对list进行去重操作~
内容的提问来源于stack exchange,提问作者user8164155
相关产品推荐
相关产品推荐

