Java 使用ClusterManager时如何更新地图上的标记
我正试图用服务器上更新的数据更新我的地图,但我不知道如何从地图中删除旧项目(标记和群集-使用ClusterManager)Java 使用ClusterManager时如何更新地图上的标记,java,android,google-maps,google-maps-api-3,markerclusterer,Java,Android,Google Maps,Google Maps Api 3,Markerclusterer,我正试图用服务器上更新的数据更新我的地图,但我不知道如何从地图中删除旧项目(标记和群集-使用ClusterManager) java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers(); ArrayList<Marker> userList = new ArrayList<Marker>(userColle
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
我有一个BroadcastReceiver,当有新的数据时,它会产生意图。我尝试过这样的方法:(但它会给我不支持的操作异常“…getMarkers().clear();”
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
我仅使用此功能将数据添加到地图
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
java.util.Collection userCollection=mClusterManager.getMarkerCollection().getMarkers();
ArrayList userList=新的ArrayList(userCollection);
//现在userList是空的吗
for(标记:userList){
marker.remove();
}
java.util.Collection userCollection2=mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList userList2=新的ArrayList(userCollection2);
//现在userList2是空的吗
for(标记:userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
我把全部时间都集中在ClusterManager上,所以我忘记了谷歌地图,特别是方法clear()
。我能够用这段代码解决问题:
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
mGoogleMap.clear();
mClusterManager.clearItems(); // calling just in case (may not be needed)
mClusterManager.addItems(LocationGetter.getReports());
根据
ClusterManager
,我们可以使用mClusterManager.cluster();
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
此方法强制重新群集。您可能希望在添加后调用此方法
新项目
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
没有任何API通知集群项已更新。 但是您可以使用
clusterManager.removietem()
+clusterManager.addItem()
强制更新项目
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
但您必须小心,因为您通常想要更新项目,因为它更改了一些影响渲染的属性。您需要使用一个自定义的ClusterRenderer
,它支持此操作并覆盖onClusterItemRendered()
和/或onClusterRendered()
。使用onBefore变体不起作用,因为它们在创建标记时只被调用一次
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
您可以查看此GitHub问题因为我的应用程序在创建地图后需要多次更新群集,我发现此工作流是删除和添加新群集的最佳解决方案:
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
mGoogleMap.clear();
mClusterManager.clear();
//Do work to add items to cluster
mClusterManager.addItems(yourItemsList);
//Finally
mClusterManager.cluster();
这将迫使集群在修改内容后重新运行。我想知道我怎么会遇到这个问题-我以前从未在地图节点上遇到过这样的问题
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
但是,这在我的示例应用程序的设置或更新映射逻辑中:
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
mClusterManager = new ClusterManager<>(getContext(), googleMap);
mClusterManager.setAnimation(false);
mClusterManager.clearItems();
mClusterManager=newclustermanager(getContext(),googleMap);
mClusterManager.setAnimation(false);
mClusterManager.clearItems();
我从数据库中添加节点,然后从请求中添加一些节点,在我为构造函数添加空检查之前,这是一个明显的影响
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
i、 e.我应该这样做:
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
if (mClusterManager == null)
mClusterManager = new ClusterManager<>(getContext(), googleMap);
mClusterManager.setAnimation(false);
mClusterManager.clearItems();
if(mClusterManager==null)
mClusterManager=newclustermanager(getContext(),googleMap);
mClusterManager.setAnimation(false);
mClusterManager.clearItems();
我一定是复制并粘贴了这张地图,然后在上面浪费了半个小时。小心!对我有用的不是地图
clear()
,因为我还有一些其他标记没有连接到群集管理器
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
对我起作用的是:
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
this.clustermanger.clearItems()
this.clustermanager.clusterMakerCollection.clear()
//and I had to force a "cluster" again, force the clustermanager to take down all markers
this.clustermanager.cluster()
您应该能够做到:
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
val didUpdate = clusterManager?.updateItem(MyClusterItem(data))
clusterManager?.cluster()
确保clusterManager确实更新该项的关键在于重写扩展ClusterItem的类中的equals和hashcode,如:
java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
// now is userList empty
for(Marker marker: userList){
marker.remove();
}
java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
// now is userList2 empty
for(Marker marker: userList2){
marker.remove();
}
mClusterManager.addItems(LocationGetter.getReports());
fun getId(): String {
return data.id
}
override fun equals(other: Any?): Boolean {
return other is MyClusterItem && other.getId() == getId()
}
override fun hashCode(): Int {
return getId().hashCode()
}
如果您得到空的
ArrayList
,请确保有正确的ClusterManager
和MarkerCollection()
,我在这里使用了该方法。对我来说,这还不够。我正在删除和添加许多项。在操作完成后调用该方法解决了缺少刷新的问题:mClusterManager.cluster();-也许这对某些人有帮助。正如@plexus所说,需要调用cluster()以确保集群得到更新。请小心使用.clear()因为很多时候你需要放大/缩小地图才能正确更新。你能看看这篇文章吗?当使用多个项目时如何删除特定项目?你能看看这篇文章吗??