2015-09-22 12 views
7

ich Update versuchen meine Karte mit neueren Daten vom Server, aber ich kann nicht herausfinden, wie alt Elemente entfernen (Marker und Cluster - Mit ClusterManager) von der Karte (- scheint mir, dass ich nur in ClusterManager hinzufügenWie Update-Markierungen auf der Karte, wenn ClusterManager mit

I BroadcastReceiver haben die Absicht erhalten, wenn neue Daten, die ich so etwas wie dies versuchte: (aber es gibt mir UnsupportedOperationException auf Linie mit “.... .getMarkers(). clear(); "

private BroadcastReceiver myRefrestMapBroadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "onReceive"); 
     mClusterManager.clearItems(); 
     mClusterManager.getMarkerCollection().getMarkers().clear(); 
     mClusterManager.getClusterMarkerCollection().getMarkers().clear(); 
     mClusterManager.addItems(LocationGetter.getReports()); 
    } 
}; 

I hinzugefügt Daten nur mit diese Funktion abzubilden.

java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers(); 
      ArrayList<Marker> userList = new ArrayList<Marker>(userCollection); 
      // now is userList empty 
      for(Marker marker: userList){ 
       marker.remove(); 
      } 

      java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers(); 
      ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2); 
      // now is userList2 empty 
      for(Marker marker: userList2){ 
       marker.remove(); 
      } 

      mClusterManager.addItems(LocationGetter.getReports()); 
+0

Ich habe die Methode hier verwendet Wenn Sie die leere 'ArrayList' erhalten, vergewissern Sie sich, dass Sie' ClusterManager' und 'MarkerCollection()' richtig eingestellt haben. – bjiang

Antwort

5

Ich war die ganze Zeit auf ClusterManager konzentriert, so vergaß ich GoogleMap und das Verfahren clear() speziell. Ich war in der Lage, das Problem mit diesem Code zu lösen:

mGoogleMap.clear(); 
mClusterManager.clearItems(); // calling just in case (may not be needed) 
mClusterManager.addItems(LocationGetter.getReports()); 
+1

Für mich war das nicht genug. Ich entfernte und fügte viele Gegenstände hinzu. Nachdem ich die Operation beendet hatte, löste ich mein Problem mit der fehlenden Aktualisierung: mClusterManager.cluster(); - Vielleicht hilft es jemandem. – plexus

+0

Wie @plexus sagte, ist ein Aufruf von cluster() erforderlich, um sicherzustellen, dass Cluster aktualisiert werden. Und seien Sie vorsichtig mit .clear(), weil Sie oft in der Karte hinein- und herauszoomen müssen, damit die Karte korrekt aktualisiert wird. – lujop

6

Nach ClusterManagerdocumentation wir mClusterManager.cluster();

Diese Methode erzwingen Wieder Cluster verwenden können. Sie können dies nach dem Hinzufügen von neuen Artikel aufrufen.

1

Es gibt keine API, die benachrichtigt, dass ein Clusterelement aktualisiert wurde. Sie können jedoch clusterManager.removeItem() + clusterManager.addItem() verwenden, um eine Aktualisierung auf ein Element zu erzwingen.

Aber man muss vorsichtig sein, wie Sie in der Regel ein Element aktualisieren möchten, weil es einige Eigenschaften geändert hat, die Sie beeinflussen Rendering benötigen ClusterRenderer eine benutzerdefinierte verwenden, die diese unterstützt und überschreibt onClusterItemRendered() und/oder onClusterRendered(). Die Verwendung der onBefore-Varianten funktioniert nicht, da sie nur einmal bei der Marker-Erstellung aufgerufen werden.

Sie in diesem GitHub Ausgabe aussehen kann GitHub issue

1

Da meine App die Cluster mehrere Male nach der Karte aktualisieren muss erstellt wird, ich diesen Workflow als die beste Lösung neue Cluster zu entfernen und fügen Sie gefunden:

mGoogleMap.clear(); 
mClusterManager.clear(); 
//Do work to add items to cluster 
mClusterManager.addItems(yourItemsList); 
//Finally 
mClusterManager.cluster(); 

Das sollte die Cluster zwingen, nach dem Ändern des Inhalts neu zu rendern.

Verwandte Themen