如何在点击标记后更改标记图标?

7
在我们的项目中,我们使用的是Google Maps v2,并且我需要找到一种方法,在单击图钉后更改图标。另外,当单击另一个图钉时,我需要返回此图钉的初始图标。 因此,现在我们有类似以下内容的东西:
public ClusterManager.OnClusterItemClickListener<OurClusterItem> mClusterItemClickListener = new ClusterManager.OnClusterItemClickListener<OurClusterItem>() {

    @Override
    public boolean onClusterItemClick(OurClusterItem item) {
        // Some actions here
        return true;
    }
};

然后我们将此监听器设置到地图上:

ClusterManager mClusterManager = new ClusterManager<OurClusterItem>(getActivity(), getMap());
mClusterManager.setOnClusterItemClickListener(mClusterItemClickListener);
googleMap.setOnMarkerClickListener(mClusterManager);

那么,有人能提供关于这个问题的解决方案吗? 谢谢!
1个回答

13

所以,我找到了解决办法——或许对某些人也有帮助。

首先,我们需要使用我们自己的渲染器(继承自DefaultClusterRenderer)。DefaultClusterRenderer有它自己的缓存,其中包含ClusterItem和相应的Marker配对:

public MarkerCache<T> mMarkerCache = new MarkerCache<T>();

所以我在我们的CustomClusterRenderer中编写了下一个方法。

public Marker getMarker(OurClusterItem clusterItem) {
    return mMarkerCache.get(clusterItem);
}

接着,在我们的片段中,我添加了两个变量:

private Marker mCurrentSelectedMarker;
private ClusterStore mCurrentSelectedClusterItem;

并更改ClusterItemClickListener的实现:

public ClusterManager.OnClusterItemClickListener<OurClusterItem> mClusterItemClickListener = new ClusterManager.OnClusterItemClickListener<OurClusterItem>() {

    @Override
    public boolean onClusterItemClick(ClusterStore item) {
        // return to previous marker non-selected icon
        if (mCurrentSelectedMarker != null) {
            mCurrentSelectedMarker.setIcon(BitmapDescriptorFactory.fromResource(mCurrentSelectedClusterItem.getIconResourceId()));
        }
        Marker marker = mCustomRenderer.getMarker(item);
        if (marker != null) {
            mCurrentSelectedMarker = marker;
            mCurrentSelectedClusterItem = item;
            marker.setIcon(BitmapDescriptorFactory.fromResource(item.getIconSelResourceId()));
        }
        // some other code
        return true;
    }
};

就是这样,它像魔法一样工作。


我没有使用你的答案,但它给了我解决问题的方法,谢谢。 - MiguelHincapieC
谢谢,伙计,这对我有用。不过我没有使用MarkerCache。 - Rakesh Yadav
有人可以分享他们的解决方案吗? - José Nobre
1
DefaultClusterRenderer 中有一个名为 getMarker(T clusterItem) 的方法,它可以从聚合中返回标记。 - elementstyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接