How to manage click on marker which is not in Cluster in Android Google Map API?

南楼画角 提交于 2019-12-01 11:07:39

Updated answer

The image that you added in your edit explains the issue clearly, thanks for that!

In order too solve this issue we need to register the listener differently. Namely: by registering it to the ClusterManager's MarkerManager as that class handles everything of the markers now. We also need to add the NormalMarkers a bit differently, so lets go through it step by step:

1) Update the OnMarkerClickListener of the mMap:

mMap.setOnMarkerClickListener(mClusterManager.getMarkerManager()); // Note the `MarkerManager` here

2) This MarkerManager holds all the collections. We need to create a new collection on this manager to which we will add the NormalMarkers that should be displayed apart from the clusters:

MarkerManager.Collection normalMarkersCollection = mClusterManager.getMarkerManager().newCollection();

3) Adding the markers is done similar to how this was before, but with using the addMarker() method on the collection that we created. We must pass a MarkerOptions() object to this:

// Create a normal marker
val markerOptions = MarkerOptions()
    .position(new LatLng(...))
    .title("My marker")
    .snippet("With description")

// Add it to the collection
normalMarkersCollection.addMarker(markerOptions)

4) Last but not least: we want the OnClickListener on it:

normalMarkersCollection.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener {
    public boolean onMarkerClick(marker: Marker) {
        // NORMAL MARKER CLICKED!
        return false;
    }
})

5) Done! Now the normal markers are added to the map just like before, but with a working OnMarkerClickListener.


Earlier answer

(Setting the click listeners for the clusters and clustered items)

You should add the clicklistener to the mClusterManager. Setting the clicklistener on the mMap does not work when using the ClusterManager.

Thus instead of using mMap.setOnMarkerClickListener, set the ClusterItemClickListener on the cluster manager:

mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
    @Override
    public boolean onClusterItemClick(MyItem item) {
        Log.d("cluster item","clicked");
        return true;
    }
});

Additionally, if you want to capture the onclick of the clustered item item, use the ClusterClickListener:

mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
    @Override
    public boolean onClusterClick(Cluster<MyItem> cluster) {
        Log.d("cluster","clicked");
        return true;
    }
});

If you want to have both Marker and Cluster listeners working you can write

mGoogleMap.getMarkerManager().onMarkerClick(marker);

inside your OnMarkerClickListener

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!