私はライブラリを使用しています 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;
}
});
はい、できます。 ClusterManager
は2つのMarkerManager.Collections
を保持します:
これらの種類のマーカーごとに個別にカスタム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;
}
}
だから基本的にはあなたのクラスはこのように始まります:
private class MarkerItemClusterRenderer extends
DefaultClusterRenderer<MarkerItem> {
public MarkerItemClusterRenderer(Context context, GoogleMap map,
ClusterManager<MarkerItem> clusterManager) {
...
したがって、そのパラメータでは、タイプmap
のGoogleMap
は、setInfoWindowAdapter
を指定する必要がある場所です。