rof*_*ofl 8 android google-maps markerclusterer google-maps-android-api-2
我在我的应用中使用Google Maps及其群集实用程序.群集本身工作正常,但是当我尝试处理配置更改时,我遇到了问题.
这是我的情况:
fragment.markers.marker,它会突出显示并BottomSheet展开以显示.如果用户旋转屏幕(即配置更改发生),我保存选择使用的标记onSaveInstanceState(实际上我不保存标记本身,但只保存相关List条目的链接,如ID).然后,我想恢复配置更改之前的用户选择.
集群本身就像这样执行:
clusterManager.clearItems();
clusterManager.addItems(eventManager.getEventList());
clusterManager.cluster();
Run Code Online (Sandbox Code Playgroud)
当从服务器接收数据时,执行该代码.执行群集时markers,显然也会重新创建所有群集.因此,为了突出显示以前的用户选择(上一个marker),我必须知道WHEN群集实用程序何时完成其操作.到那时,我确信我可以安全地使用以下功能:
clusterManager.getRenderer()).getMarker(<param>)
Run Code Online (Sandbox Code Playgroud)
和
clusterManager.getRenderer()).getClusterItem(<param>)
Run Code Online (Sandbox Code Playgroud)
否则,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);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为,这不仅onPostExecute应该提供响应,而且应该向(像我)Renderer的用户提供响应,即群集完成.但我不想修改标准代码.ClusterManagerfragment
有没有更好的方法来处理这种情况?
你的处理方式是错误的。
您应该实施:
class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem>
Run Code Online (Sandbox Code Playgroud)
并将其设置为 ClusterManager 作为渲染器,如下所示:
mClusterManager.setRenderer(new YourClusterItemRenderer(...));
Run Code Online (Sandbox Code Playgroud)
重写 YourClusterItemRenderer 的方法onBeforeClusterItemRendered,onBeforeClusterRendered您可以根据服务器的参数根据您的逻辑更改每个标记的外观。
因此,当 ClusterManager 完成渲染时,所有标记都已经看起来像您根据用户状态等需要的那样。