【问题标题】:First Cluster stay visible when zooming on Android Google Map Clusters在 Android Google Map Clusters 上缩放时,第一个集群保持可见
【发布时间】:2017-01-25 18:40:37
【问题描述】:

我设法为我的 GMap 实现了一个工作集群管理器。但是,当我缩放时,第一个集群仍然可见。当我将算法设置为 GridBaseAlgorithm 时,我可以正常工作,但集群不在正确的位置。

这是我的 MapFragment 上的代码:

private void setUpClusterer(GoogleMap mMap) {

    // Initialize the manager with the context and the map.
    // (Activity extends context, so we can pass 'this' in the constructor.)
    mClusterManager = new ClusterManager<>(context, mMap);

   // mClusterManager.setAlgorithm(new NonHierarchicalDistanceBasedAlgorithm<ToiletMarker>());

    // Point the map's listeners at the listeners implemented by the cluster
    // manager.
    mMap.setOnCameraIdleListener(mClusterManager);
    mMap.setOnMarkerClickListener(mClusterManager);

    mMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());

    mMap.setOnInfoWindowClickListener(mClusterManager);
    mClusterManager.setOnClusterItemInfoWindowClickListener(this);

    mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<ToiletMarker>() {
        @Override
        public boolean onClusterItemClick(ToiletMarker item) {
            clickedClusterItem = item;
            return false;
        }
    });

    // Add cluster items (markers) to the cluster manager.
    addItems();

    mClusterManager.getMarkerCollection().setOnInfoWindowAdapter(
            new MyCustomAdapterForItems());
}

private void addItems() {
    for (Toilet toilet : toiletArrayList) {
        Location location = toilet.getLocation();
        double lat = location.getLatitude();
        double lon = location.getLongitude();

        ToiletMarker item = new ToiletMarker(lat, lon, toilet);
        mClusterManager.addItem(item);
    }
    mClusterManager.cluster();
}

@Override
public void onMapReady(GoogleMap googleMap) {
    Log.d(TAG, "Map ready");
    mMap = googleMap;

    setUpClusterer(mMap);
}

@Override
public void onClusterItemInfoWindowClick(ToiletMarker myItem) {
    Toast.makeText(context, "clicked on myItem : " + myItem.getPosition().toString(), Toast.LENGTH_SHORT).show();
}
public class MyCustomAdapterForItems implements GoogleMap.InfoWindowAdapter {

        @Override
        public View getInfoWindow(Marker marker) {
            return null;
        }

        @Override
        public View getInfoContents(Marker marker) {
            // Getting view from the layout file info_window_layout
            View v = LayoutInflater.from(context).inflate(R.layout.markerlayout, null);

            mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                public void onInfoWindowClick(Marker marker) {
                    LatLng latLng = marker.getPosition();
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?daddr=" + latLng.latitude + "," + latLng.longitude));
                    context.startActivity(intent);
                }
            });

            //Do stuff
        // Returning the view containing InfoWindow contents
        return v;
    }

这里有 2 张图片:

编辑:

花了一个小时试图解决之后,我终于明白了发生了什么:问题是集群管理器工作正常,问题是我填充地图的方法被调用了两次。

要解决这个问题,只需添加 mMap.clear();在添加标记之前:)

【问题讨论】:

    标签: java android google-maps google-maps-markers cluster-computing


    【解决方案1】:

    Here 您可以查看我的自定义ClusterRenderer 并尝试根据您的编辑和需求来实现。

    主要是:

    override fun shouldRenderAsCluster(cluster: Cluster<MapClusterItem>?): Boolean {
           val isZoomLevelSuites = currentZoomLevel < MAX_ZOOM_LVL - POINT_ZOOM_LVL
           return super.shouldRenderAsCluster(cluster) && isZoomLevelSuites
    }
    

    它不应该在您指定的某种缩放级别后渲染集群。希望对您有所帮助!

    【讨论】:

    • 这是一个老问题,我设法解决了这个问题,但我不记得是怎么解决的了^^
    • 哦,没看问时间戳:D
    【解决方案2】:

    在我的例子中,我同时向 map 和 clusterManager 添加了标记。 如果您将项目添加到 clusterManager - 您已经在地图上有标记。

    【讨论】:

      猜你喜欢
      • 2013-06-15
      • 2016-01-11
      • 2013-07-28
      • 2015-07-31
      • 1970-01-01
      • 2019-06-22
      • 2015-07-10
      • 1970-01-01
      • 2014-10-01
      相关资源
      最近更新 更多