Android自定义InfoWindow使用标记群集

时间:2014-11-30 20:54:59

标签: android google-maps

我使用google maps api聚类标记。由于我想将自定义图标作为标记,因此我创建了一个自定义渲染器(扩展了DefaultClusterRenderer)。在onBeforeClusterItemRendered我设置了所需的图标。

问题是我现在想要创建自定义infowindow。如果我这样做:

googleMap.setInfoWindowAdapter(new InfoWindowAdapter() {

        // Use default InfoWindow frame
        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }

        // Defines the contents of the InfoWindow
        @Override
        public View getInfoContents(Marker arg0) {



        }
    });

getInfoContents我可以自定义信息窗口。问题是传递的参数类型为Marker。因为我正在使用群集,所以我使用自定义标记(MyMarker)作为信息。 我无法将Marker投射到MyMarker,也无法将参数更改为MyMarker。我不想这样做来提取信息。

我如何仍然维护群集(此处我可以访问MyMarker信息)但是创建自定义信息窗口?

public MarkerRenderer() {
        super(getActivity(), mGoogleMap, mClusterManager);         

    }



    @Override
    protected void onBeforeClusterItemRendered(MyMarker myMarker, MarkerOptions markerOptions) {
        markerOptions.icon(BitmapDescriptorFactory.fromResource(myMarker.getMarkerImage())).title(
                "This is my custom marker with the default infoWindo");
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<MyMarker> cluster, MarkerOptions markerOptions) {
        super.onBeforeClusterRendered(cluster, markerOptions);
        markerOptions.title("cluster size " + cluster.getSize());

    }

1 个答案:

答案 0 :(得分:0)

This answer建议在点击监听器中存储对群集或标记的引用。

map.setOnMarkerClickListener(clusterMgr);
clusterMgr.setOnClusterClickListener(new OnClusterClickListener<MarkerItem>() {
    @Override
    public boolean onClusterClick(Cluster<MarkerItem> cluster) {
        clickedCluster = cluster; // remember for use later in the Adapter
        return false;
    }
});
clusterMgr.setOnClusterItemClickListener(new OnClusterItemClickListener<MarkerItem>() {
    @Override
    public boolean onClusterItemClick(MarkerItem item) {
        clickedClusterItem = item;
        return false;
    }
});

然后您可以在适配器中使用该引用。

class MyCustomAdapterForClusters implements InfoWindowAdapter {
@Override
public View getInfoContents(Marker marker) {
    if (clickedCluster != null) {
        for (MarkerItem item : clickedCluster.getItems()) {
            // Extract data from each item in the cluster as needed
        }
    }
    // build your custom view
    // ...
    return view;
}
}

示例代码引用InfoWindowAdapter,但它也适用于MarkerRenderer;您可以将自定义标记作为参数传递给构造函数。