Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 放大时未隐藏簇标记_Android_Google Maps_Google Maps Api 3_Google Maps Api 2_Markerclusterer - Fatal编程技术网

Android 放大时未隐藏簇标记

Android 放大时未隐藏簇标记,android,google-maps,google-maps-api-3,google-maps-api-2,markerclusterer,Android,Google Maps,Google Maps Api 3,Google Maps Api 2,Markerclusterer,我试图在我的地图上实现一个簇标记,它的行为有点奇怪,首先,它向我显示簇标记,但也向我显示点标记,这不应该发生,当我放大仍然显示的簇标记时,我会添加一些图像来更好地解释它 public class MapaViagem extends FragmentActivity { private GoogleMap googleMap; private String rm_IdViagem; private List<ClienteModel> mClienteMod

我试图在我的地图上实现一个簇标记,它的行为有点奇怪,首先,它向我显示簇标记,但也向我显示点标记,这不应该发生,当我放大仍然显示的簇标记时,我会添加一些图像来更好地解释它

public class MapaViagem extends FragmentActivity {

    private GoogleMap googleMap;
    private String rm_IdViagem;
    private List<ClienteModel> mClienteModel = new ArrayList<ClienteModel>();
    private List<EnderecoModel> mEnderecoModel = new ArrayList<EnderecoModel>();
    private ViagemModel mViagemModel = new ViagemModel();
    private ClusterManager<MyItem> mClusterManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.maps);
         ArrayList<LatLng> coordList = new ArrayList<LatLng>();

        try {

            Bundle parametros = getIntent().getExtras();
            rm_IdViagem = parametros.getString("id_viagem");

            Repositorio ca = new Repositorio(this);
            mViagemModel = ca.getViagemPorId(Integer.valueOf(rm_IdViagem));

            Repositorio cl = new Repositorio(this);
            mClienteModel = cl.getClientesViagem(Integer.valueOf(rm_IdViagem));


            System.out.println("TEM CLIENTE " + mClienteModel.size());

            if(mClienteModel != null) {

                for (int i = 0; i < mClienteModel.size(); i++) {


                    Repositorio mRepositorio = new Repositorio(this);
                    mEnderecoModel = mRepositorio.getListaEnderecosDoCliente(Integer.valueOf(mClienteModel.get(i).getClientes_id()));


                    for (int j = 0; j < mEnderecoModel.size(); j++) {
                        // Loading map
                        initilizeMap();
                        // Changing map type
                        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                        // Showing / hiding your current location
                        googleMap.setMyLocationEnabled(true);

                        // Enable / Disable zooming controls
                        googleMap.getUiSettings().setZoomControlsEnabled(true);

                        // Enable / Disable my location button
                        googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                        // Enable / Disable Compass icon
                        googleMap.getUiSettings().setCompassEnabled(true);

                        // Enable / Disable Rotate gesture
                        googleMap.getUiSettings().setRotateGesturesEnabled(true);

                        // Enable / Disable zooming functionality
                        googleMap.getUiSettings().setZoomGesturesEnabled(true);


                        final float latitude = Float.parseFloat(mEnderecoModel.get(j).getLatitude());
                        final float longitude = Float.parseFloat(mEnderecoModel.get(j).getLongitude());


                        coordList.add(new LatLng(latitude, longitude));


                        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 10));



                        mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);


                        mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));

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


                        addItems(coordList);

                    }


                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public class MyClusterRenderer extends DefaultClusterRenderer<MyItem> {

        public MyClusterRenderer(Context context, GoogleMap map,
                                 ClusterManager<MyItem> clusterManager) {
            super(context, map, clusterManager);
        }

        @Override
        protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
            super.onBeforeClusterItemRendered(item, markerOptions);



//            item.setTitle(mClienteModel.get(i));
            markerOptions.title(item.getTitle());
        }

        @Override
        protected void onClusterItemRendered(MyItem clusterItem, Marker marker) {
            super.onClusterItemRendered(clusterItem, marker);

            //here you have access to the marker itself
        }

 @Override
        protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) {
            return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster
        }
    }


    private void addItems(List<LatLng> markers) {

        for (int i = 0; i < markers.size(); i++) {
            MyItem offsetItem = new MyItem(markers.get(i));
            mClusterManager.addItem(offsetItem);

        }
        mClusterManager.cluster();
    }



    private void initilizeMap() {
        if (googleMap == null) {
            googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                    R.id.map)).getMap();

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Não foi possível carregar o mapa", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        initilizeMap();
    }


}


首先,您需要定义当您的
ClusterManager
应该集群化时,因此在
MyClusterRenderer
中有一个方法,您应该覆盖:

@Override
protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) {
    return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster
}
编辑:

我只是再看一遍你的代码,发现你忘了设置聚类算法,应该是:

    ...
    mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);
    mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());

    mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));
    ...
。。。
mClusterManager=newclustermanager(MapaViagem.this,googleMap);
setAlgorithm(新的GridBasedAlgorithm());
setRenderer(新的MyClusterRenderer(MapaViagem.this、googleMap、McClusterManager));
...

我知道这是一篇老文章,但今天我遇到了同样的问题

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

要解决此问题,只需添加
mMap.clear()在添加标记之前。在这里工作很有魅力


再见。

我遇到了这个问题,并通过确保ClusterManager只被创建并分配给映射一次来解决它,尝试将and if语句放入您的create方法中。 最有可能是在onResume中再次初始化导致问题的映射时

    public void onMapReady(GoogleMap googleMap) {
    map = googleMap;

    //only create one instance of cluster manager, 
    // if created again in onResume then click listeners don't work on reload and 
    //some markers don't disappear correctly on Zoom
    if (clusterManager == null){
    clusterManager =new ClusterManager(this, map);
     }

    map.setOnMarkerClickListener(clusterManager);
    map.setOnInfoWindowClickListener(clusterManager.getMarkerManager());
    map.setBuildingsEnabled(true);
    //noinspection MissingPermission
    map.setMyLocationEnabled(true);
    map.setOnCameraIdleListener(clusterManager);


    clusterManager.setOnClusterItemInfoWindowClickListener(this);


    clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
                @Override
                public boolean onClusterItemClick(MyItem item) {
                    return false;
                }
            });
public void onMapReady(谷歌地图谷歌地图){
地图=谷歌地图;
//仅创建群集管理器的一个实例,
//如果在onResume中再次创建,请单击“侦听器不工作”“重新加载”并
//某些标记在缩放时无法正确消失
if(clusterManager==null){
clusterManager=新的clusterManager(此,地图);
}
setOnMarkerClickListener(clusterManager);
setOnInfoWindowClickListener(clusterManager.getMarkerManager());
map.setBuildingsEnabled(true);
//不允许检查
map.setMyLocationEnabled(true);
map.setOnCameraideListener(clusterManager);
setOnClusterItemInfo窗口ClickListener(此);
setOnClusterItemClickListener(新的clusterManager.OnClusterItemClickListener(){
@凌驾
公共布尔onClusterItemClick(MyItem){
返回false;
}
});

我做了您建议的更改,但仍然得到了相同的结果现在更糟糕的是,我得到了一个计数为5的聚类标记,它不在我的LatLng参数中。我有相同的问题。但是,GridBaseAlgorithm将标记放在网格上,它们离实际位置很远。尽管它隐藏了标记,但这确实令人讨厌群集。你知道如何解决这个问题吗?可能使用另一种算法HMI也有类似的问题,即我的标记和群集只有在我第一次放大/缩小时才会出现。调用mClusterManager.cluster();为我工作,非常感谢伙计..当标记位于同一位置时,你找到了这样做的方法吗?即使我也面临同样的问题。想知道你是如何做到的。@AshwinNarayanan我刚刚停止使用群集标记,我无法解决,抱歉
    ...
    mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);
    mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());

    mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));
    ...
    public void onMapReady(GoogleMap googleMap) {
    map = googleMap;

    //only create one instance of cluster manager, 
    // if created again in onResume then click listeners don't work on reload and 
    //some markers don't disappear correctly on Zoom
    if (clusterManager == null){
    clusterManager =new ClusterManager(this, map);
     }

    map.setOnMarkerClickListener(clusterManager);
    map.setOnInfoWindowClickListener(clusterManager.getMarkerManager());
    map.setBuildingsEnabled(true);
    //noinspection MissingPermission
    map.setMyLocationEnabled(true);
    map.setOnCameraIdleListener(clusterManager);


    clusterManager.setOnClusterItemInfoWindowClickListener(this);


    clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
                @Override
                public boolean onClusterItemClick(MyItem item) {
                    return false;
                }
            });