我在应用程序中使用谷歌地图及其集群实用程序。集群本身运行良好,但当我试图处理配置更改时,我遇到了问题。
这是我的案例:
- 用户在屏幕上看到一个地图,它是一个
fragment
- 聚类完成后,地图上会出现标记。用户可以与
markers
进行交互 - 当用户选择一个
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的方法onBeforeClusterItemRendered
和onBeforeClusterRendered
,您可以根据服务器中的参数根据逻辑更改每个标记的外观。
因此,当ClusterManager完成渲染时,根据用户状态等,所有标记都已经看起来像您想要的了。