Android,地图群集完成时的回调

时间:2016-09-28 09:24:28

标签: android google-maps google-maps-android-api-2 markerclusterer

我在我的应用中使用Google地图及其群集实用程序。集群本身工作正常,但是当我尝试处理配置更改时,我遇到了问题。

这是我的情况:

  1. 用户在屏幕上看到地图,即fragment
  2. 完成聚类后,将显示地图上的标记。用户可以与markers进行互动。
  3. 当用户选择marker时,会突出显示该BottomSheet并展开onSaveInstanceState
  4. 如果用户旋转屏幕(即配置更改发生),我使用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()); } )提供群集完成的回复。但我不想修改标准代码。

    有没有更好的方法来处理这种情况?

1 个答案:

答案 0 :(得分:1)

你这是错误的方式。

你应该实现:

class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem>

并将其设置为ClusterManager作为渲染器,如下所示:

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

覆盖YourClusterItemRenderer的方法onBeforeClusterItemRenderedonBeforeClusterRendered,您可以根据服务器中的参数根据逻辑更改每个标记的外观。

因此,当ClusterManager完成渲染时,所有标记看起来都像是根据用户状态等想要它们。