Подтвердить что ты не робот

Отображение пользовательской InfoWindow для Android-карты Утилита для Android

Я использую библиотеку Google Maps Utility для 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);
    }
}

Есть ли кто-нибудь, кто использовал библиотеку и знает, как показать пользовательский InfoWindow, например, способ, которым он использовался на Картах Google? Как:

getMap().setInfoWindowAdapter(new InfoWindowAdapter() {

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

    @Override
    public View getInfoContents(Marker arg0) {
        return null;
    }
});
4b9b3361

Ответ 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;
    }
}

Ответ 2

Итак, у вас есть свой класс, начинающийся вот так:

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

Итак, в этом параметре map типа GoogleMap вы должны указать свой setInfoWindowAdapter.