Android: Google Maps Clustermanager ведет себя странно. Значок кластера иногда не исчезает при полном увеличении. Почему?

Я написал следующий метод для отображения моих маркеров (кластеризованных). Тем не менее, некоторые из кластеров работают нормально, т. е. когда я увеличиваю масштаб, синий значок кластера (например, 10+) исчезает и показывает отдельные маркеры. Однако иногда, когда я полностью увеличиваю масштаб, синий кластерный маркер все еще отображается при полном увеличении ВМЕСТЕ с одним из отдельных маркеров. Почему это происходит?

private void displayCluster(List<MyItem> items) {

      mClusterManager = new ClusterManager<MyItem>(this, googleMap);
      mClusterManager.setRenderer(new MyRender(getApplicationContext(),googleMap,mClusterManager));

      googleMap.setOnCameraChangeListener(mClusterManager);
      googleMap.setOnMarkerClickListener(mClusterManager);

       for (MyItem item : items) {
           mClusterManager.addItem(item);
       }
   }

person Zac1    schedule 30.11.2015    source источник
comment
Проверьте stackoverflow.com/questions/ 27236046/. может помочь вам   -  person Sunny    schedule 30.11.2015
comment
Я попробовал три шага там, и они не решили проблему.   -  person Zac1    schedule 30.11.2015


Ответы (1)


DefaultClusterRenderer решает, должны ли маркеры быть кластеризованы или нет. Этот класс содержит метод DefaultClusterRenderer#shouldRenderAsCluster(), в котором кластеризация начинается только тогда, когда размер кластера > MIN_CLUSTER_SIZE. Значение по умолчанию MIN_CLUSTER_SIZE равно 4.

Вам необходимо расширить класс DefaultClusterRenderer и переопределить метод shouldRenderAsCluster(), чтобы обеспечить собственную логику:

class CustomRenderer<T extends ClusterItem> extends DefaultClusterRenderer<T>
{
    public CustomRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
        super(context, map, clusterManager);            
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
        //start clustering if at least 2 items overlap
        //Change your logic here
        return cluster.getSize() > 1;
    }
}

private void setUpMapIfNeeded() {
    if (mMap != null) {
        return;
    }
    mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    if (mMap != null) {
        mClusterManager = new ClusterManager<Place>(this, mMap);
        mClusterManager.setRenderer(new CustomRenderer<Place>(this, mMap, mClusterManager));
        ........
    }
}
person Sunny    schedule 30.11.2015
comment
+1 за указание на shouldRenderAsCluster(). Другой способ — установить минимальный размер кластера, например setMinClusterSize(1); - person Seph Remotigue; 30.08.2017