显示适用于Android的Android Maps Utility Library的自定义InfoWindow

nol*_*man 31 android google-maps markerclusterer google-maps-android-api-2

我正在使用Google Maps Utility for Android,它允许在地图中创建聚类,我需要显示自定义,InfoWindow但我找不到任何方法来执行此操作.为了显示信息窗口,我有以下类,并且在方法onClusterItemRendered中我可以访问标记的信息:

class MyClusterRenderer extends DefaultClusterRenderer<MarkerItem> {

    public MyClusterRenderer(Context context, GoogleMap map,
            ClusterManager<MarkerItem> clusterManager) {
        super(context, map, clusterManager);
    }

    @Override
    protected void onBeforeClusterItemRendered(MarkerItem item,
            MarkerOptions markerOptions) {
        super.onBeforeClusterItemRendered(item, markerOptions);
        markerOptions.title(String.valueOf(item.getMarkerId()));
    }

    @Override
    protected void onClusterItemRendered(MarkerItem clusterItem,
            Marker marker) {
        super.onClusterItemRendered(clusterItem, marker);
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有人使用过该库并知道如何显示自定义内容,InfoWindow例如Google地图中使用的方式?喜欢:

getMap().setInfoWindowAdapter(new InfoWindowAdapter() {

    @Override
    public View getInfoWindow(Marker arg0) {
        return null;
    }

    @Override
    public View getInfoContents(Marker arg0) {
        return null;
    }
});
Run Code Online (Sandbox Code Playgroud)

Ron*_*onR 59

是的,这可以做到.ClusterManager保持两个MarkerManager.Collections:

  • 一个用于簇标记,和
  • 一个用于单个项目标记

您可以InfoWindowAdapter单独为这些标记中的每一种设置自定义.


履行

首先,将ClusterManager的MarkerManager安装为地图的InfoWindowAdapter:

ClusterManager<MarkerItem> clusterMgr = new ClusterManager<MarkerItem>(context, map);
map.setInfoWindowAdapter(clusterMgr.getMarkerManager());
Run Code Online (Sandbox Code Playgroud)

接下来,将您的自定义安装InfoWindowAdapter为一个或两个标记集合的适配器:

clusterMgr.getClusterMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForClusters());
clusterMgr.getMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForItems());
Run Code Online (Sandbox Code Playgroud)

最后一部分是将Marker您在自定义InfoWindowAdapter回调中接收的原始对象映射ClusterItem到您首先添加到地图的对象.这可以使用onClusterClick和onClusterItemClick侦听器来实现,如下所示:

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

现在,您拥有在各自的适配器中组装自定义InfoWindow内容所需的一切!例如:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 做得好!我只想警告人们,我没有注意到一段代码:`map.setOnMarkerClickListener(clusterMgr);`并且回调从未被命中.显然需要在源代码中注释:`/*设置在点击单个ClusterItem时调用的回调.注意:要使thislistener起作用,必须将ClusterManager作为单击侦听器添加到地图中.*/public void setOnClusterItemClickListener(OnClusterItemClickListener <T> listener){mOnClusterItemClickListener = listener; mRenderer.setOnClusterItemClickListener(收听); }` (4认同)
  • 一切都好,这只是我的错误,所以我想突出这一点 (3认同)