Simple solution
Just got the same problem. The solution is simple: call ClusterManager listeners from your own event listeners. Look at the concept:
private OnMapReadyCallback listenerMapReady = (googleMap) ->
{
googleMap.setOnCameraIdleListener(() -> {
mClusterManager.onCameraIdle(); //call cluster manager listener
//....your code for setOnCameraIdleListener event
});
googleMap.setOnMarkerClickListener(marker -> {
if (marker != null && ... check if marker is NOT from cluster manager ....) {
//......your code for unclustered markers, added directly to the map
return false;
}
else
return mClusterManager != null && mClusterManager.onMarkerClick(marker); // let cluster manager do his job
});
}
To ensure that cluster manager internals will not intercept onMarkerClick listener, lets reset listener every time after cluster manager did his stuff. I've put it right into OnCameraIdle event:
public class FragmentRoutes extends Fragment {
private MapView mMapView;
private GoogleMap mMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_routes, container, false);
mMapView = rootView.findViewById(R.id.ac_main_map); // map rendering holder
if (mMapView != null)
mMapView.onCreate(savedInstanceState);
//....... other onCreate mess
}
@Override
public void onResume() {
super.onResume();
if (mMapView != null) {
mMapView.onResume();
mMapView.getMapAsync(listenerMapReady);
}
}
// on marker click listener for the map
private GoogleMap.OnMarkerClickListener listenerMarkerClick = marker -> {
//markers which tag is TransportItem were added directly to map, I will take care of them
if (marker != null && marker.getTag() instanceof TransportItem) {
//......do my tasks for clicked transport marker
return false;
}
else {
// other markers are cluster manager markers, process as usual
return mClusterManager != null && mClusterManager.onMarkerClick(marker);
}
}
// listener for map ready event
private OnMapReadyCallback listenerMapReady = (googleMap) ->
{
if (getContext() == null)
return;
mMap = googleMap;
mMap.setOnCameraIdleListener(() -> {
mClusterManager.onCameraIdle();
//....your code for setOnCameraIdleListener event
// now reset marker click listener
mMap.setOnMarkerClickListener(listenerMarkerClick); //reset marker click listener
});
}
}
Thats all! Happy androiding :)