簡體   English   中英

使用 ClusterManager 時如何更新地圖上的標記

[英]How update markers on Map when using ClusterManager

我正在嘗試使用來自服務器的較新數據更新我的地圖,但我無法弄清楚如何從地圖中刪除舊項目(標記和集群 - 使用 ClusterManager )( - 在我看來,我只能添加到 ClusterManager 中。

我有 BroadcastReceiver,當有新數據時它會得到意圖。 我正在嘗試這樣的事情:(但它給了我UnsupportedOperationException“...getMarkers().clear();”

private BroadcastReceiver myRefrestMapBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive");
        mClusterManager.clearItems();
        mClusterManager.getMarkerCollection().getMarkers().clear();
        mClusterManager.getClusterMarkerCollection().getMarkers().clear();
        mClusterManager.addItems(LocationGetter.getReports());
    }
};

添加了數據以僅使用此功能進行映射。

java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
            ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
            // now is userList empty
            for(Marker marker: userList){
                marker.remove();
            }

            java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
            ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
            // now is userList2 empty
            for(Marker marker: userList2){
                marker.remove();
            }

            mClusterManager.addItems(LocationGetter.getReports());

根據ClusterManager 文檔,我們可以使用mClusterManager.cluster();

此方法強制重新群集。 您可能想在添加新項目后調用它。

我一直專注於 ClusterManager,所以我忘記了GoogleMap ,特別是clear()方法。 我能夠用這段代碼解決這個問題:

mGoogleMap.clear();
mClusterManager.clearItems();  // calling just in case (may not be needed)
mClusterManager.addItems(LocationGetter.getReports());

沒有任何 API 來通知集群項目已更新。 但是您可以使用clusterManager.removeItem() + clusterManager.addItem()強制更新項目。

但是你必須小心,因為你通常想要更新一個項目,因為它改變了一些影響渲染的屬性,你需要使用一個自定義的ClusterRenderer支持這個並覆蓋onClusterItemRendered()和/或onClusterRendered() 使用 onBefore 變體不起作用,因為它們僅在標記創建時調用一次。

你可以看這個GitHub issue GitHub issue

由於我的應用程序需要在創建地圖后多次更新集群,我發現此工作流程是刪除和添加新集群的最佳解決方案:

mGoogleMap.clear();
mClusterManager.clear(); 
//Do work to add items to cluster
mClusterManager.addItems(yourItemsList);
//Finally 
mClusterManager.cluster(); 

這應該會強制集群在修改內容后重新渲染。

對我有用的不是clear()地圖,因為我還有一些其他標記沒有附加到集群管理器。

對我有用的是:

this.clustermanger.clearItems()
this.clustermanager.clusterMakerCollection.clear()
//and I had to force a "cluster" again, force the clustermanager to take down all markers
this.clustermanager.cluster()

你應該能夠做到:

val didUpdate = clusterManager?.updateItem(MyClusterItem(data))
clusterManager?.cluster()

這里確保 clusterManager 確實更新項目的關鍵是覆蓋擴展 ClusterItem 的類中的 equals 和 hashcode,例如:

fun getId(): String {
    return data.id
}
override fun equals(other: Any?): Boolean {
    return other is MyClusterItem && other.getId() == getId()
}
override fun hashCode(): Int {
    return getId().hashCode()
}

我想知道我怎么會遇到這個問題 - 我以前從未遇到過地圖節點這樣的問題。

但是,這是在我的示例應用程序的設置或更新地圖邏輯中:

        mClusterManager = new ClusterManager<>(getContext(), googleMap);
        mClusterManager.setAnimation(false);
        mClusterManager.clearItems();

我從數據庫中添加節點,然后從請求中添加一些節點,有一個明顯的影響,直到我為構造函數添加了空檢查

即,這就是我應該擁有的方式:

    if (mClusterManager == null)
            mClusterManager = new ClusterManager<>(getContext(), googleMap);
        mClusterManager.setAnimation(false);
        mClusterManager.clearItems();

我一定是復制粘貼了這個,浪費了半個小時……小心!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM