[英]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.