web-dev-qa-db-ja.com

Android Maps Maps Library for Android

私はライブラリを使用しています Android向けGoogleマップユーティリティ これにより、マップにクラスタリングを作成でき、カスタム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);
    }
}

ライブラリを使用し、Googleマップでの使用方法など、カスタムInfoWindowを表示する方法を知っている人はいますか?お気に入り:

getMap().setInfoWindowAdapter(new InfoWindowAdapter() {

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

    @Override
    public View getInfoContents(Marker arg0) {
        return null;
    }
});
32
noloman

はい、できます。 ClusterManagerは2つのMarkerManager.Collectionsを保持します:

  • 1つはクラスターマーカー用で、
  • 個別のアイテムマーカーに1つ

これらの種類のマーカーごとに個別にカスタムInfoWindowAdapterを設定できます。


実装

まず、ClusterManagerのMarkerManagerをマップのInfoWindowAdapterとしてインストールします。

ClusterManager<MarkerItem> clusterMgr = new ClusterManager<MarkerItem>(context, map);
map.setInfoWindowAdapter(clusterMgr.getMarkerManager());

次に、カスタムInfoWindowAdapterを一方または両方のマーカーコレクションのアダプターとしてインストールします。

clusterMgr.getClusterMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForClusters());
clusterMgr.getMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForItems());

最後の部分は、カスタムInfoWindowAdapterのコールバックで受け取る生のMarkerオブジェクトを、最初にマップに追加した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;
    }
});

これで、カスタム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;
    }
}
59
RonR

だから基本的にはあなたのクラスはこのように始まります:

private class MarkerItemClusterRenderer extends
        DefaultClusterRenderer<MarkerItem> {
    public MarkerItemClusterRenderer(Context context, GoogleMap map,
            ClusterManager<MarkerItem> clusterManager) {
    ...

したがって、そのパラメータでは、タイプmapGoogleMapは、setInfoWindowAdapterを指定する必要がある場所です。

0
noloman