I want to change the background of the cluster marker when clicked. I do it through
@Override onClusterClick(Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(....); }
This works great for one case: when I zoom in or out and the number of cluster markers does not change. For example, if I had a cluster of 15 clusters and 5, and then increase the level to or from, the same two clusters remain. Clicking on one of them now renderer.getMarker(cluster) returns null. If they are re-clustered after scaling, getMarker is not zero.
My DefaultClusterRenderer is below. I checked the marker on onClusteredRendered and it was never null. Is this a bug in the DefaultClusterRenderer or do I need to do something else?
private class MyRenderer extends DefaultClusterRenderer<MyObject> { private IconGenerator iconGenerator; private float density; public MyRenderer(Context context, GoogleMap map, ClusterManager<MyObject> clusterManager) { super(context, map, clusterManager); density = context.getResources().getDisplayMetrics().density; } @Override protected void onBeforeClusterItemRendered(MyObject item, MarkerOptions markerOptions) { markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_pin)); } @Override protected void onBeforeClusterRendered(Cluster<MyObject> cluster, MarkerOptions markerOptions) { if(iconGenerator == null) { iconGenerator = new IconGenerator(getActivity()); iconGenerator.setContentView(makeTextView(getActivity())); } iconGenerator.setBackground(makeBackground(false)); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon(String.valueOf(cluster.getSize())))); } @Override protected void onClusterRendered(Cluster<MyObject> cluster, Marker marker) { super.onClusterRendered(cluster, marker);
Initializing ClusterManager:
final ClusterManager<MyObject> mClusterManager = new ClusterManager<>(getActivity(), googleMap); mClusterManager.addItems(items); renderer = new CustomRenderer(getActivity(), googleMap, mClusterManager); mClusterManager.setRenderer(renderer); mClusterManager.cluster(); mClusterManager.setOnClusterItemClickListener(this); googleMap.setOnMarkerClickListener(mClusterManager);
@antonio: This initialization works for me:
public class MapsActivity extends FragmentActivity implements ClusterManager.OnClusterClickListener<MyObject> { // ... private void setUpClusterer() { googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10)); mClusterManager = new ClusterManager<MyObject>(this, googleMap); mClusterManager.setOnClusterClickListener(this); renderer = new MyRenderer(this, googleMap, mClusterManager); mClusterManager.setRenderer(renderer); googleMap.setOnCameraChangeListener(mClusterManager); googleMap.setOnMarkerClickListener(mClusterManager); addItems(); } private void addItems() { // Set some lat/lng coordinates to start with. double lat = 51.5145160; double lng = -0.1270060; // Add ten cluster items in close proximity, for purposes of this example. for (int i = 0; i < 10; i++) { double offset = i / 60d; lat = lat + offset; lng = lng + offset; MyObject offsetItem = new MyObject(lat, lng); mClusterManager.addItem(offsetItem); } } @Override public boolean onClusterClick(final Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.my_newpin)); return true; } }