I'm trying to clustering the markers on google map because there's too many markers on the map (approximately 6000+ markers).
So I googled and found some documentations about marker clustering and I apply it to my source code, but markers are not shown in google map.
Partial source code of FragMap fragment.
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    SupportMapFragment map = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.display_map);
    if (map == null) {
        Log.e(Tag, "Google Map fragment(id: display_map) is null reference!");
        return;
    }
    map.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
    if (DataPackage.getEQMarkerManager() == null) {
        if (!DataPackage.initializeEQMarkerManager(getActivity(), googleMap)) {
            Log.w(Tag, "EQMarkerManager initialization failure");
        }
    }
}
and partial source code of EQMarkerManager and it's implements GoogleMap.OnCameraIdleListener interface.
public EQMarkerManager(Context ctx, GoogleMap map) {
    // ...
    clusterManager = new ClusterManager<>(ctx, map);
    clusterManager.setRenderer(new EQRenderer<>(ctx, map, clusterManager));
    map.setOnCameraIdleListener(this);
    clusterManager.addItems(markers);
}
@Override
public void onCameraIdle() {
    Log.d(Tag, "onCameraIdle");
}
but onCameraIdle callback was never called. Why OnCameraIdle event is not firing? 
gradle:
compile 'com.google.android.gms:play-services-maps:9.8.0'
compile 'com.google.maps.android:android-maps-utils:0.4.4+'
Tested on Marshmallow device (SDK version 23).
ADDED: What is the meaning of + on gradle compile?
The 'onCameraIdle' event was not firing because I called 'setOnCameraIdleListener' on another class.
Source code from my question
FragMap:
@Override
public void onMapReady(GoogleMap googleMap) {
    if (DataPackage.getEQMarkerManager() == null) {
        if (!DataPackage.initializeEQMarkerManager(getActivity(), googleMap)) {
            Log.w(Tag, "EQMarkerManager initialization failure");
        }
    }
}
EQMarkerManager:
public EQMarkerManager(Context ctx, GoogleMap map) {
    // ...
    clusterManager = new ClusterManager<>(ctx, map);
    clusterManager.setRenderer(new EQRenderer<>(ctx, map, clusterManager));
    map.setOnCameraIdleListener(this);
    clusterManager.addItems(markers);
}
initializeEQMarkerManager method does initialize EQMarkerManager class and EQMarkerManager#ctor calls setOnCameraIdleListener. I don't know much about android, so I'm completely sure about those code works. But it wasn't :/
Anyway, I solve this problem by calling setOnCameraIdleListener inside of FragMap.
@Override
public void onMapReady(GoogleMap googleMap) {
    if (DataPackage.getEQMarkerManager() == null) {
        if (!DataPackage.initializeEQMarkerManager(getActivity())) {
            Log.w(Tag, "EQMarkerManager initialization failure");
            return;
        }
    }
    googleMap.setOnCameraIdleListener(DataPackage.getEQMarkerManager());
}
The 'onCameraIdle' will not fire because 'setOnCameraIdleListener' is called internally by ClusterManager class . So what we can do is
mmap.setOnCameraIdleListener(this);
When implementing OnCameraIdleListener
    @Override
    public void onCameraIdle() {
        clustermanager.onCameraIdle();
    }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With