在 android 谷歌地图中更改集群管理器项目图标
Posted
技术标签:
【中文标题】在 android 谷歌地图中更改集群管理器项目图标【英文标题】:Changing clustermanager item icon in android google maps 【发布时间】:2016-03-27 09:13:13 【问题描述】:我的安卓应用中有一个谷歌地图。它充满了标记,将标记聚集在一起……简而言之,这是一张完全可用的地图。
我想做的很简单。当用户点击 clusterItem 时,我想将图标更改为选定的图标。 (简单地说,相同的标记,但颜色不同)。
我如何在屏幕上使用大量标记,每次单击标记时都无法清理地图并添加标记。
所以:
mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>()
@Override
public boolean onClusterItemClick(MyItem myItem)
if (oldItemSelected != null)
mClusterManager.removeItem(oldItemSelected);
oldItemSelected.setItemAsNotSelected();
mClusterManager.addItem(oldItemSelected);
mClusterManager.removeItem(myItem);
myItem.setItemAsSelected();
mClusterManager.addItem(myItem);
mClusterManager.cluster();
oldItemSelected = myItem;
return true;
);
这个想法是从地图中删除点击的项目,将其设置为“选中”,添加新项目并使用 .cluster 方法刷新地图。
会发生什么:该项目没有改变,有时该项目是“重复的”并且所选项目位于“正常”项目之后。
这是我设置集群管理器的方式:
mClusterManager = new ClusterManager<MyItem>(this, map);
mClusterManager.setRenderer(new MyItemRenderer());
mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());
map.setOnMarkerClickListener(mClusterManager);
这是项目渲染器:
private class MyItemRenderer extends DefaultClusterRenderer<MyItem>
public MyItemRenderer()
super(getApplicationContext(), map, mClusterManager);
@Override
protected void onBeforeClusterItemRendered(MyItem myItem, MarkerOptions markerOptions)
markerOptions.title(myItem.getName());
markerOptions.snippet(myItem.getAddress());
markerOptions.icon(BitmapDescriptorFactory.fromResource(myItem.getIcon()));
@Override
protected boolean shouldRenderAsCluster(Cluster cluster)
return cluster.getSize() > 1;
public Marker getMarker(MyItem item)
return super.getMarker(item);
有什么方法可以做到这一点而不必重新绘制地图中的每个项目?
public class MyItem extends DefaultClusterRenderer<WifiSpotItem>
private HashMap<Integer, Marker> markerWifiSpots = new HashMap<>();
public MyItem(Context context, GoogleMap map, ClusterManager<WifiSpotItem> mClusterManager)
super(context, map, mClusterManager);
@Override
protected void onBeforeClusterItemRendered(WifiSpotItem wifiSpotItem, MarkerOptions markerOptions)
if (markerOptions != null && wifiSpotItem != null)
markerOptions.title(wifiSpotItem.getName() != null ? wifiSpotItem.getName() : Constants.EMPTY_STRING);
markerOptions.snippet(wifiSpotItem.getAddress() != null ? wifiSpotItem.getAddress() : Constants.EMPTY_STRING);
markerOptions.icon(BitmapDescriptorFactory.fromResource(wifiSpotItem.getIcon()));
@Override
protected void onClusterItemRendered(WifiSpotItem clusterItem, Marker marker)
markerWifiSpots.put(clusterItem.getId(), marker);
super.onClusterItemRendered(clusterItem, marker);
@Override
protected boolean shouldRenderAsCluster(Cluster cluster)
return cluster.getSize() > 4;
public Marker getMarker(WifiSpotItem item)
return super.getMarker(item);
public Marker getMarker(int id)
Marker item;
if (markerWifiSpots != null)
item = markerWifiSpots.get(id);
else
item = null;
return item;
【问题讨论】:
请也粘贴您的 MyItem 类,以便我清楚地了解问题。 @Javier Sivianes 我已经添加了@vivek 嗨!你找到解决办法了吗?如果是,请发布您的答案。谢谢! 【参考方案1】:似乎渲染任务忽略了已经显示在屏幕上的对象。我尝试将MyItem
对象的新实例(onClusterItemClick
方法参数的副本)添加到集群管理器,它可以工作。
mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>()
@Override
public boolean onClusterItemClick(MyItem myItem)
...
mClusterManager.removeItem(myItem);
MyItem copy = myItem.copy();
copy.setItemAsSelected();
mClusterManager.addItem(copy);
mClusterManager.cluster();
...
);
【讨论】:
以上是关于在 android 谷歌地图中更改集群管理器项目图标的主要内容,如果未能解决你的问题,请参考以下文章