Android,当地图聚类完成时回调



我在应用程序中使用谷歌地图及其集群实用程序。集群本身运行良好,但当我试图处理配置更改时,我遇到了问题。

这是我的案例:

  1. 用户在屏幕上看到一个地图,它是一个fragment
  2. 聚类完成后,地图上会出现标记。用户可以与markers进行交互
  3. 当用户选择一个marker时,它会高亮显示,并且BottomSheet会展开显示

如果用户旋转屏幕(即发生配置更改(,我会使用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的方法onBeforeClusterItemRenderedonBeforeClusterRendered,您可以根据服务器中的参数根据逻辑更改每个标记的外观。

因此,当ClusterManager完成渲染时,根据用户状态等,所有标记都已经看起来像您想要的了。

最新更新