Firebase数据去重:使用Adapter获取数据并移除ArrayList重复值
解决Firebase获取数据后ArrayList去重的问题
你现在遇到的核心问题是HashSet没法正确识别location相同的Hotels对象——Java默认的HashSet是通过对象的equals()和hashCode()方法判断重复的,如果你的Hotels类没重写这两个方法,哪怕两个对象的location完全一样,HashSet也会把它们当成不同的实例,自然达不到去重效果。
第一步:给Hotels类重写equals()和hashCode()方法
让Hotels类基于location字段判断对象是否相等,这样HashSet才能正确工作。示例代码如下:
public class Hotels { private String location; // 构造函数、getter、setter方法请自行补充 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Hotels hotels = (Hotels) o; return Objects.equals(location, hotels.location); } @Override public int hashCode() { return Objects.hash(location); } }
第二步:优化去重逻辑
你当前在循环内部反复创建HashSet、清空列表的操作效率很低,完全可以把去重放在循环结束后统一执行:
// Global ArrayList loca = new ArrayList<>(); // onCreate mRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { loca.clear(); // 先清空旧数据,避免新旧数据重复累加 for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { Hotels hotels = postSnapshot.getValue(Hotels.class); loca.add(hotels); } // 循环结束后统一去重 HashSet<Hotels> hs = new HashSet<>(loca); loca.clear(); loca.addAll(hs); // 这里记得通知Adapter数据更新,比如调用notifyDataSetChanged() } @Override public void onCancelled(DatabaseError databaseError) { // 别忘了处理监听取消的异常情况 Log.e("FirebaseError", databaseError.getMessage()); } });
可选:添加时直接去重(更高效)
如果不想等到最后统一处理,也可以在添加前先判断列表中是否已有相同location的对象,避免重复添加:
mRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { loca.clear(); for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { Hotels hotels = postSnapshot.getValue(Hotels.class); boolean isDuplicate = false; for (Hotels h : loca) { if (h.getLocation().equals(hotels.getLocation())) { isDuplicate = true; break; } } if (!isDuplicate) { loca.add(hotels); } } // 更新Adapter } @Override public void onCancelled(DatabaseError databaseError) { Log.e("FirebaseError", databaseError.getMessage()); } });
这样处理后,你的列表就能得到{"USA", "CANADA"}的期望结果了。
内容的提问来源于stack exchange,提问作者jo10
相关产品推荐
相关产品推荐

