在 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 谷歌地图中更改集群管理器项目图标的主要内容,如果未能解决你的问题,请参考以下文章

仅在谷歌地图上呈现可见集群项目的最佳方式

无法单击标记 - 谷歌地图集群Android,无法在谷歌地图中显示信息窗口

如何更改谷歌地图绘图管理器工具栏工具提示?

Android Studio 谷歌地图集群

带有毕加索的谷歌地图集群项目标记图标

如何在我的微调器中使用 getItemAtPosition 从谷歌地图中的火力基地使用 android studio