我在我的应用中使用Google地图及其群集实用程序。集群本身工作正常,但是当我尝试处理配置更改时,我遇到了问题。
这是我的情况:
fragment
。markers
进行互动。marker
时,会突出显示该BottomSheet
并展开onSaveInstanceState
。如果用户旋转屏幕(即配置更改发生),我使用List
保存选择的标记(实际上我不保存标记本身,但只保存相关clusterManager.clearItems();
clusterManager.addItems(eventManager.getEventList());
clusterManager.cluster();
条目的链接,如ID) 。然后,我想恢复配置更改之前的用户选择。
群集本身就像这样执行:
markers
当从服务器接收数据时,执行此代码。执行群集时,显然也会重新创建所有marker
。因此,为了突出显示以前的用户选择(之前的clusterManager.getRenderer()).getMarker(<param>)
),我必须知道WHEN群集实用程序何时完成其操作。到那时我确信我可以安全地使用这样的功能,如:
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
的用户(如我的public void ShowHtml(){
// Enable Javascript
WebSettings webSettings = statshtml.getSettings();
webSettings.setJavaScriptEnabled(true);
statshtml.getSettings().setLoadWithOverviewMode(true);
statshtml.loadData(str, "text/html; charset=utf-8", "UTF-8");
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_print:
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
createWebPrintJob(statshtml);
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private void createWebPrintJob(WebView webView) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
// Get a PrintManager instance
PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
// Get a print adapter instance
PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();
// Create a print job with name and adapter instance
String jobName = getString(R.string.app_name) + " Document";
printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build());
}
)提供群集完成的回复。但我不想修改标准代码。
有没有更好的方法来处理这种情况?
答案 0 :(得分:1)
你这是错误的方式。
你应该实现:
class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem>
并将其设置为ClusterManager作为渲染器,如下所示:
mClusterManager.setRenderer(new YourClusterItemRenderer(...));
覆盖YourClusterItemRenderer的方法onBeforeClusterItemRendered
和onBeforeClusterRendered
,您可以根据服务器中的参数根据逻辑更改每个标记的外观。
因此,当ClusterManager完成渲染时,所有标记看起来都像是根据用户状态等想要它们。