我正在使用geofire库从firebase3加载一个特定区域的数据,但是当我向数据库添加新标记并且我检查我的地图时我发现在同一个latlng坐标中添加了多个标记,我的问题是如何防止标记从相同的坐标重复。这是Geofire方法:
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
try{
items.add(new MyItem(location.latitude, location.longitude));
Log.d("onKey","called");
}catch (ClassCastException e){
Log.d("classCastException","");
}
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
parseJsonToList();
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
});
ParseJsonToList方法:
private void parseJsonToList() {
itemss = clusterManagerAlgorithm.getItems();
try {
items.removeAll(itemss);
}catch (IndexOutOfBoundsException e){
Log.d("itemsDoesn't exist"," : ");
}
mClusterManager.clearItems();
mClusterManager.cluster();
mClusterManager.addItems(items);
Log.d("items"," : " + items);
}
根据您发布的代码,两点可以成为问题的根源。
首先,它是多次调用GeoQueryEventListener.onKeyEntered()
,修复它你可以做一个像这样的解决方法:
try{
MyItem myItem = new MyItem(location.latitude, location.longitude);
if (!items.contains(myItem)) {
items.add(myItem);
}
Log.d("onKey","called");
}catch (ClassCastException e){
Log.d("classCastException","");
}
第二,也许你忘了覆盖equals()
类的hashcode()
和MyItem
方法。所以,当你打电话给items.removeAll(itemss);
时,没有一个项目被删除。
在这两种情况下,需要equals()
类的重写hashcode()
和MyItem
方法。在AndroidStudio中使用the autogenerating function很容易。