SlaneR
SlaneR

Reputation: 714

GoogleMap onCameraIdle event not firing

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?

Upvotes: 7

Views: 7365

Answers (2)

Wahdat Jan
Wahdat Jan

Reputation: 4156

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();
    }

Upvotes: 3

SlaneR
SlaneR

Reputation: 714

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());
}

Upvotes: 5

Related Questions