Ответ 1
Да, это можно сделать. ClusterManager
поддерживает два 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());
Заключительная часть - это сопоставление исходного 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;
}
});
Теперь у вас есть все, что вам нужно, чтобы собрать свой собственный контент 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;
}
}