Android, обратный вызов при завершении кластеризации карты

Я использую Google Maps и свою утилиту кластеризации в своем приложении. Сама кластеризация работает нормально, но у меня проблема, когда я пытаюсь справиться с изменениями конфигурации.

Это мой случай:

  1. Пользователь видит карту на экране, который является fragment .
  2. Когда кластеризация завершена, появляются маркеры на карте. Пользователь может взаимодействовать с markers .
  3. Когда пользователь выбирает marker , он подсвечивается, а BottomSheet расширяется для отображения.

Если пользователь поворачивает экран (т. onSaveInstanceState Происходит изменение конфигурации), я сохраняю, какой маркер был выбран с помощью onSaveInstanceState (фактически я не сохраняю сам маркер, а только ссылку на соответствующую запись List такую ​​как ID). Затем я хочу восстановить этот пользовательский выбор, который был до изменения конфигурации.

Сама кластеризация выполняется следующим образом:

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

Этот код выполняется, когда данные принимаются с сервера. Когда кластеризация выполняется, все markers , очевидно, также воссоздаются. Поэтому, чтобы выделить предыдущий пользовательский выбор (предыдущий marker ), я должен знать, КОГДА программа кластеризации завершает свою работу. К тому времени я уверен, что могу безопасно использовать такие функции, как:

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

а также

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

В противном случае они иногда возвращают значение null , если задача кластеризации еще не завершена.

Тем не менее, я не могу найти разумный способ, как получить ответ от утилиты кластеризации (например, ClusterManager ), когда кластеризация завершена. Я думаю, мне нужно обновить этот стандартный код кластеризации:

  /** * 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); } } 

Я думаю, что onPostExecute должен предоставлять ответ не только Renderer , но и пользователю ClusterManager (например, моему fragment ), что кластеризация выполнена. Но я не хочу изменять стандартный код.

Есть ли лучший способ справиться с этим делом?

Вы делаете это неправильно.

Вы должны реализовать:

 class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem> 

И установите его в ClusterManager как средство визуализации следующим образом:

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

Переопределите методы YourClusterItemRenderer onBeforeClusterItemRendered и onBeforeClusterRendered и там вы можете изменить то, что каждый маркер выглядит в соответствии с вашей логикой в ​​соответствии с параметрами вашего сервера.

Поэтому, когда ClusterManager завершает рендеринг, все ваши маркеры уже выглядят так, как будто вы хотите их в соответствии с состоянием пользователя и т. Д.

Intereting Posts