5

Używam Map Google i narzędzia do tworzenia klastrów w mojej aplikacji. Samo klastrowanie działa dobrze, ale mam problem, kiedy próbuję radzić sobie ze zmianami konfiguracji.Android, oddzwonienie po zakończeniu grupowania map

To jest moja sprawa:

  1. użytkownik widzi na ekranie mapy, który jest fragment.
  2. Po utworzeniu klastrów pojawiają się znaczniki na mapie. Użytkownik może wchodzić w interakcję z markers.
  3. Gdy użytkownik wybierze , zostanie podświetlony, a rozszerzenie BottomSheet zostanie rozwinięte.

Jeśli użytkownik obraca ekranu (zdarza tj zmianę konfiguracji), zapisać co marker został wybrany za pomocą onSaveInstanceState (właściwie nie zapisać sam znacznik, ale tylko link do powiązanej List wpisu jak ID). Następnie chcę przywrócić ten wybór użytkownika, który był przed zmianą konfiguracji.

klastrowania sama jest wykonywany tak:

clusterManager.clearItems(); 
clusterManager.addItems(eventManager.getEventList()); 
clusterManager.cluster(); 

Ten kod jest wykonywany, gdy dane są odbierane z serwera. Podczas wykonywania klastrowania wszystkie oczywiście są również odtwarzane. Aby podkreślić poprzedni wybór użytkownika (poprzedni), muszę wiedzieć, GDY narzędzie do tworzenia klastrów zakończyło działanie. Do tego czasu jestem pewien, że mogę bezpiecznie korzystać z takich funkcji jak:

clusterManager.getRenderer()).getMarker(<param>) 

i

clusterManager.getRenderer()).getClusterItem(<param>) 

inaczej, to powróci null czasami, jeśli zadanie grupowanie nie jest jeszcze zakończona.

Jednak nie można znaleźć rozsądnego sposobu, w jaki sposób uzyskać odpowiedź z narzędzia do grupowania (tj. ClusterManager), gdy klastrowanie zostanie zakończone. Chyba trzeba aktualizować standardowy kod grupowania:

/** 
    * Runs the clustering algorithm in a background thread, then re-paints when results come back. 
    */ 
    private class ClusterTask extends AsyncTask<Float, Void, Set<? extends Cluster<T>>> { 
     @Override 
     protected Set<? extends Cluster<T>> doInBackground(Float... zoom) { 
      mAlgorithmLock.readLock().lock(); 
      try { 
       return mAlgorithm.getClusters(zoom[0]); 
      } finally { 
       mAlgorithmLock.readLock().unlock(); 
      } 
     } 

     @Override 
     protected void onPostExecute(Set<? extends Cluster<T>> clusters) { 
      mRenderer.onClustersChanged(clusters); 
     } 
    } 

myślę, że onPostExecute powinna udzielić odpowiedzi nie Renderer tylko, ale do użytkownika ClusterManager (jak moja fragment), że tworzenie klastrów jest wykonywana. Ale nie chcę modyfikować standardowego kodu.

Czy istnieje lepszy sposób postępowania w tej sprawie?

+1

Czy próbowali za pomocą 'OnMapLoadedCallback'? Zgodnie z dokumentacją (https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback) funkcja 'onMapLoaded()' jest wywoływana po zakończeniu renderowania mapy – antonio

+0

Cóż, to może być w porządku, ale problem polega na tym, że mogę rysować znaczniki i klastry zaraz po otrzymaniu danych z serwera, ale czasami mapa jest ładowana przed otrzymaniem danych (z powodu problemów z połączeniem itp.). Prawdopodobnie to nie zadziała. – rofl

Odpowiedz

0

Podejmujesz tę decyzję w niewłaściwy sposób.

Należy wdrożyć:

class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem> 

i ustawić ją na ClusterManager jako renderer jak ten:

mClusterManager.setRenderer(new YourClusterItemRenderer(...)); 

nadpisywania metod YourClusterItemRenderer za onBeforeClusterItemRendered i onBeforeClusterRendered i nie można zmienić, co każdy znacznik wygląda według twoja logika według parametrów z twojego serwera.

Więc kiedy ClusterManager zakończy rendering wszystkie markery już wyglądać jak chcesz je według stanu użytkownika itp

Powiązane problemy