Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Maps de Android ClusteredMarkers – no muestran unclustered?

Estoy usando la utilidad Google Maps Android Marker Clustering de aquí y estoy agregando un montón de elementos (unos 700) de una lista que recibo de mi servidor. He arreglado mis errores iniciales y puedo ver los grupos, luego ampliarlos y verlos decluster en marcadores individuales. Sin embargo, hay un par de elementos que están distantes de todos los demás, por lo que incluso en el máximo de alejamiento, que nunca sería agrupado. Por alguna razón, estos elementos no se muestran en mi mapa – no cuando hago zoom en, no cuando alejo.

He comprobado las coordenadas, son reales, y antes de que comience a usar el agrupamiento no pude ver estos elementos ningún problema, así que supongo que he hecho algo mal en mi código de clúster.

Aquí está un código:

private void setUpClusterer() { // Initialize the manager with the context and the map mClusterManager = new ClusterManager<>(getActivity(), map); vendorRenderer = new VendorRenderer(); mClusterManager.setRenderer(vendorRenderer); mClusterManager.setOnClusterClickListener(this); mClusterManager.setOnClusterItemClickListener(this); //point the maps listeners at the listeners implemented by the cluster manager map.setOnCameraChangeListener(mClusterManager); map.setOnMarkerClickListener(mClusterManager); //add items to the cluster manager addClusterItems(-1); mClusterManager.cluster(); } private void addClusterItems(int positionToMark) { if (null == list) { return; } LatLng position; int maxMarkers = Math.min(list.size(), getResources().getInteger(R.integer.number_of_results_on_map)); mClusterManager.clearItems(); for (int i = 0; i < maxMarkers; i++) { vendorItem = list.get(i); if (vendorItem.getAddress().contains("Remote 1")) { Log.e("Kibi", "Adding Remote 1, pos = " + i); Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString()); } if (vendorItem.getAddress().contains("Clustered 1")) { Log.e("Kibi", "Adding Clustered 1, pos = " + i); Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString()); } if (vendorItem.getAddress().contains("Remote 2")) { Log.e("Kibi", "Adding Remote 2, pos = " + i); Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString()); } VendorMapItem item = new VendorMapItem(vendorItem.getPointCoordinates(), "Some other text"); if (i == positionToMark) { selectedItem = item; } mClusterManager.addItem(item); } if (-1 == positionToMark) { selectedItem = null; } } 

Esto muestra los elementos que se añaden – Los registros que he agregado me ayudan a ver que mis 2 elementos remotos se agregan con buenas coordenadas, y parecen similares (aunque distantes de) mi elemento agrupado seleccionado (que se ve)

Aquí está el código del renderizador:

 /* This draws the markers for us */ private class VendorRenderer extends DefaultClusterRenderer<VendorMapItem> { Context context = getActivity().getApplicationContext(); public final IconGenerator mIconGenerator = new IconGenerator(context); public final IconGenerator mSelectedIconGenerator = new IconGenerator(context); private final View mItemView; private final View mSelectedItemView; public VendorRenderer() { super(getActivity().getApplicationContext(), map, mClusterManager); // Create selected custom Marker RelativeLayout selectedContainer = (RelativeLayout) view.findViewById(R.id.marker_map_selected_container); mSelectedItemView = ((LayoutInflater) getActivity().getSystemService (Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_selected_layout, selectedContainer, false); mSelectedIconGenerator.setContentView(mSelectedItemView); mSelectedIconGenerator.setBackground(null); // Create custom Marker LinearLayout container = (LinearLayout) view.findViewById(R.id.text_marker_map_container); mItemView = ((LayoutInflater) getActivity().getSystemService (Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_layout, container, true); mIconGenerator.setContentView(mItemView); mIconGenerator.setBackground(null); } @Override protected void onBeforeClusterItemRendered(VendorMapItem vendor, MarkerOptions markerOptions) { // Draw a single vendor. Bitmap icon; if (null == selectedItem || !vendor.getPosition().equals(selectedItem.getPosition())) { icon = mIconGenerator.makeIcon(); } else { icon = mSelectedIconGenerator.makeIcon(); } markerOptions.title(vendor.getTitle()); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)); } @Override protected void onBeforeClusterRendered(Cluster<VendorMapItem> cluster, MarkerOptions markerOptions) { // Draw multiple vendors clustered... Bitmap icon = mIconGenerator.makeIcon(); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)); } @Override protected boolean shouldRenderAsCluster(Cluster cluster) { // Always render clusters. return cluster.getSize() > 1; } } 

En general, los elementos agrupados se muestran, y también declustered, si está seleccionado o no. Tengo otra vista que muestra todos los datos de las localizaciones en una lista y mis localizaciones remotas demuestran para arriba apenas aletas allí.

Alguna idea de lo que estoy haciendo mal?

  • Cómo mostrar InfoWindow con Android Maps Utility Library para Android
  • Android maps utils cluster icon color
  • Mejores prácticas al agrupar gran cantidad de marcadores en Google Maps Android V2
  • Utilidad de Google Maps: cómo obtener todos los marcadores de ClusterManager <?>?
  • Mostrar la información personalizada de InfoWindow para Android Maps Utility Library for Android
  • Refreshing makers (ClusterItems) en Google Maps v2 para Android
  • La adición de nuevos marcadores en el mapa utilizando el gestor de clúster no refleja los cambios hasta que haga zoom y aleje el mapa
  • DefaultClusterRenderer getMarker () devuelve null cuando se hace zoom
  • 2 Solutions collect form web for “Maps de Android ClusteredMarkers – no muestran unclustered?”

    Estupidez.

    Básicamente estaba llamando map.clear () demasiadas veces. Supongo que no hay necesidad de llamar claro si todo lo que se dibuja en el mapa son los pines que son controlados por el clusterer. Una vez que se borraron las llamadas clear (), mis pins aparecen de nuevo.

    Clase pública ClusterIconProvider implementa IconDataProvider {

     private static final int[] res = {R.drawable.m1,R.drawable.m2,R.drawable.m3,R.drawable.m4,R.drawable.m5}; private static final int[] forCounts = { 10, 100, 1000, 10000, Integer.MAX_VALUE }; private Bitmap[] baseBitmaps; private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); private Rect bounds = new Rect(); private MarkerOptions markerOptions = new MarkerOptions().anchor(0.5f, 0.5f); public ClusterIconProvider(Resources resources){ baseBitmaps = new Bitmap[res.length]; for (int i = 0; i < res.length; i++) { baseBitmaps[i] = BitmapFactory.decodeResource(resources, res[i]); } paint.setColor(Color.WHITE); paint.setTextAlign(Align.CENTER); paint.setTextSize(resources.getDimension(R.dimen.Cluster)); } @Override public MarkerOptions getIconData(int markersCount) { // TODO Auto-generated method stub Bitmap base; int i = 0; do { base = baseBitmaps[i]; } while (markersCount >= forCounts[i++]); Bitmap bitmap = base.copy(Config.ARGB_8888, true); String text = String.valueOf(markersCount); paint.getTextBounds(text, 0, text.length(), bounds); float x = bitmap.getWidth() / 2.0f; float y = (bitmap.getHeight() - bounds.height()) / 2.0f - bounds.top; Canvas canvas = new Canvas(bitmap); canvas.drawText(text, x, y, paint); BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(bitmap); return markerOptions.icon(icon); } 

    }

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.