Android cluster and marker clicks

前端 未结 4 2011
执笔经年
执笔经年 2020-12-03 05:56

I\'m using the android clustering utility on a map and succesffuly implemented an onclick listener with mClusterManager.setOnClusterItemClickListener() for all the markers h

4条回答
  •  天命终不由人
    2020-12-03 06:08

    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 :)

提交回复
热议问题