DefaultClusterRenderer getMarker () Rückgabe null beim Zoomen

Ich möchte den Hintergrund der Cluster-Marker auf Klick ändern. Ich mache das über

@Override onClusterClick(Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(....); } 

Das funktioniert gut für einen Fall: Wenn ich ein- oder auszoomen und die Anzahl der Cluster-Marker nicht ändert. Zum Beispiel, wenn ich einen 15 Cluster und einen 5 Cluster hätte, dann zähle ein Level in oder out, die gleichen zwei Cluster bleiben. Klicken Sie auf einen dieser jetzt renderer.getMarker(cluster) gibt null zurück. Wenn sie nach dem Zoomen neu gruppieren, ist getMarker nicht null.

Mein DefaultClusterRenderer ist unten. Ich überprüfte den Marker auf onClusteredRendered und es ist nie null. Ist das ein Fehler im DefaultClusterRenderer oder soll ich etwas anderes machen?

 private class MyRenderer extends DefaultClusterRenderer<MyObject> { private IconGenerator iconGenerator; private float density; public MyRenderer(Context context, GoogleMap map, ClusterManager<MyObject> clusterManager) { super(context, map, clusterManager); density = context.getResources().getDisplayMetrics().density; } @Override protected void onBeforeClusterItemRendered(MyObject item, MarkerOptions markerOptions) { markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_pin)); } @Override protected void onBeforeClusterRendered(Cluster<MyObject> cluster, MarkerOptions markerOptions) { if(iconGenerator == null) { iconGenerator = new IconGenerator(getActivity()); iconGenerator.setContentView(makeTextView(getActivity())); } iconGenerator.setBackground(makeBackground(false)); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon(String.valueOf(cluster.getSize())))); } @Override protected void onClusterRendered(Cluster<MyObject> cluster, Marker marker) { super.onClusterRendered(cluster, marker); // Marker is never null here } @Override protected boolean shouldRenderAsCluster(Cluster<MyObject> cluster) { return cluster.getSize() > 1; } private ShapeDrawable makeBackground(boolean isClicked) { ShapeDrawable background = new ShapeDrawable(new OvalShape()); background.setColorFilter(ContextCompat.getColor(getActivity(), isClicked ? R.color.cluster_marker_clicked : R.color.cluster_marker_unclicked), PorterDuff.Mode.SRC_ATOP); return background; } private SquareTextView makeTextView(Context context) { SquareTextView squareTextView = new SquareTextView(context); ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(-2, -2); squareTextView.setLayoutParams(layoutParams); squareTextView.setTextColor(ContextCompat.getColor(getActivity(), R.color.white)); squareTextView.setTypeface(Utils.getFontBold(getActivity())); squareTextView.setId(com.google.maps.android.R.id.text); int twelveDpi = (int) (12.0F * density); squareTextView.setPadding(twelveDpi, twelveDpi, twelveDpi, twelveDpi); return squareTextView; } public IconGenerator getIconGenerator(boolean isClicked) { iconGenerator.setBackground(makeBackground(isClicked)); return iconGenerator; } } 

Initialisierung des ClusterManagers:

  final ClusterManager<MyObject> mClusterManager = new ClusterManager<>(getActivity(), googleMap); mClusterManager.addItems(items); renderer = new CustomRenderer(getActivity(), googleMap, mClusterManager); mClusterManager.setRenderer(renderer); mClusterManager.cluster(); mClusterManager.setOnClusterItemClickListener(this); googleMap.setOnMarkerClickListener(mClusterManager); 

@antonio: Diese Initialisierung funktioniert für mich:

 public class MapsActivity extends FragmentActivity implements ClusterManager.OnClusterClickListener<MyObject> { // ... private void setUpClusterer() { googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10)); mClusterManager = new ClusterManager<MyObject>(this, googleMap); mClusterManager.setOnClusterClickListener(this); renderer = new MyRenderer(this, googleMap, mClusterManager); mClusterManager.setRenderer(renderer); googleMap.setOnCameraChangeListener(mClusterManager); googleMap.setOnMarkerClickListener(mClusterManager); addItems(); } private void addItems() { // Set some lat/lng coordinates to start with. double lat = 51.5145160; double lng = -0.1270060; // Add ten cluster items in close proximity, for purposes of this example. for (int i = 0; i < 10; i++) { double offset = i / 60d; lat = lat + offset; lng = lng + offset; MyObject offsetItem = new MyObject(lat, lng); mClusterManager.addItem(offsetItem); } } @Override public boolean onClusterClick(final Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.my_newpin)); return true; } } 

  • Wie stelle ich mein eigenes Icon für Marker in Cluster in Google Maps ein
  • Android Maps ClusteredMarkers - nicht gruppiert anzeigen?
  • Android Maps Point Clustering
  • Das Hinzufügen neuer Markierungen auf der Karte mit Cluster-Krippe spiegelt nicht die Änderungen, bis ich zoome und verkleinere die Karte
  • Wie man Text auf Android IconGenerator zentriert
  • Google Maps Utility: Wie bekomme ich alle Marker von ClusterManager <?>?
  • Wie man InfoWindow mit Android Maps Utility Library für Android zeigt
  • Erfrischende Hersteller (ClusterItems) in Google Maps v2 für Android
  • One Solution collect form web for “DefaultClusterRenderer getMarker () Rückgabe null beim Zoomen”

    Konnte nicht renderer.getMarker(cluster) , um einen Marker in diesem Fall oben zurückzugeben. Eine Arbeit um zu schaffen war:

     Map <Cluster<MyObject>, Marker> clusterMarkerMap = new HashMap<>(); 

    Dann füge sie auf den DefaultClusterRenderer Rückruf hinzu, da der Marker dort niemals null ist:

     @Override protected void onClusterRendered(Cluster<MyObject> cluster, Marker marker) { super.onClusterRendered(cluster, marker); clusterMarkerMap.put(cluster, marker); } 

    Da der DefaultClusterManager löscht, wenn sich die Kameraposition ändert, wischen Sie die Cluster-Marker-Map ab, bevor sie neue schafft:

      googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { // Clear the map here because the markers will be recreated // when the manager is notified of a (zoom level) camera change if(zoomLevelChanged) clusterMarkerMap.clear(); mClusterManager.onCameraChange(cameraPosition); } }); 

    Jetzt kann ich den Marker erfolgreich clusterMarkerMap.get(cluster)

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.