Android open InfoWindow on cluster marker

2019-05-06 04:00发布

I implemented a option to find the nearest marker from the actual position. I have all the markers in a ClusterItem with a custom InfoWindow. On a normal google map without clustering I could just use marker.showInfoWindow(); and the InfoWindow would popup. It seems there is no such method when using clustering, because the markers don't get added as proper maps markers.

My code:

public class StationsFragment extends Fragment implements OnMapReadyCallback {
    private static GoogleMap googleMap;

    private ClusterManager<MyItem> clusterManager;
    private MyItem clickedClusterItem;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.main_activity, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Utils.changeLanguage(getActivity());

        final SupportMapFragment map = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        map.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap map) {
        googleMap = map;

        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(0.0, 0.0), 10));
        map.setMyLocationEnabled(true);

        clusterManager = new ClusterManager<>(getActivity(), map);

        map.setOnCameraChangeListener(clusterManager);
        map.setOnMarkerClickListener(clusterManager);
        map.setInfoWindowAdapter(clusterManager.getMarkerManager());

        clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
            @Override
            public boolean onClusterItemClick(MyItem item) {
                clickedClusterItem = item;
                return false;
            }
        });

        loadMarkers();
    }

    private void loadMarkers() {
        clusterManager.addItem(new MyItem(lat, lng, title, snippet));
    }

    public class ItemAdapter implements GoogleMap.InfoWindowAdapter {

        private final View view;

        ItemAdapter() {
            view = getActivity().getLayoutInflater().inflate(R.layout.info_window, null);
        }

        @Override
        public View getInfoWindow(Marker marker) {
            TextView title = (TextView) view.findViewById(R.id.info_title);
            title.setText(clickedClusterItem.getTitle());

            TextView snippet = (TextView) view.findViewById(R.id.info_snippet);
            snippet.setText(clickedClusterItem.getSnippet());

            return view;
        }

        @Override
        public View getInfoContents(Marker marker) {
            return null;
        }
    }

    public class MyItem implements ClusterItem {
        private final LatLng position;
        private final String title;
        private final String snippet;

        public MyItem(double lat, double lng, String title, String snippet) {
            this.position = new LatLng(lat, lng);
            this.title = title;
            this.snippet = snippet;
        }

        @Override
        public LatLng getPosition() {
            return position;
        }

        public String getTitle(){
            return title;
        }

        public String getSnippet(){
            return snippet;
        }
    }
}

2条回答
The star\"
2楼-- · 2019-05-06 04:30

You can show info window on clustered item, by overriding Renderer:

override fun onClusterItemRendered(clusterItem: MarkerItem?, marker: Marker?) {
        super.onClusterItemRendered(clusterItem, marker)
        getMarker(clusterItem).showInfoWindow()
    }

Please check, this will display infoWindow for all one by one and only last item window will be visible

查看更多
等我变得足够好
3楼-- · 2019-05-06 04:41

It seems you have not clusterManager.cluster() method of ClusterManager you need to add call this method once marker Items added to the clusterManager

for cluster customization please find below code:

    private class CustomMapClusterRenderer<T extends ClusterItem> extends DefaultClusterRenderer<T> {
            CustomMapClusterRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
                super(context, map, clusterManager);
            }

            @Override
            protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
                //start clustering if 2 or more items overlap
                return cluster.getSize() >= Constants.MINIMUM_CLUSTER_SIZE;
            }

            @Override
            protected void onBeforeClusterItemRendered(T item,
                                                       MarkerOptions markerOptions) {
                ClusterMarkerItem markerItem = (ClusterMarkerItem) item;
                markerOptions.icon(markerItem.getmBitmapDescriptor());
            }  
            @Override
            protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) {
// for dynamically change custom map markericon
                BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.pin_cluster);
                markerOptions.icon(descriptor);
            }

            @Override
            protected void onClusterRendered(Cluster<T> cluster, Marker marker) {
                super.onClusterRendered(cluster, marker);
    //add infowindow to cluster icon
                marker.setTitle("count");
                marker.setSnippet("Total Count - " + cluster.getItems().size());
            }
        }
查看更多
登录 后发表回答