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

如何去除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:29:36