2015-09-22 13 views
7

Tôi cố gắng để cập nhật bản đồ của tôi với dữ liệu mới từ máy chủ nhưng tôi không thể tìm ra cách để xoá các mục cũ (dấu và cụm - Sử dụng ClusterManager) từ bản đồ (- dường như với tôi rằng tôi chỉ có thể thêm vào ClusterManagerLàm thế nào cập nhật đánh dấu trên bản đồ khi sử dụng ClusterManager

tôi có BroadcastReceiver đó có được ý định khi có dữ liệu mới, tôi đã cố gắng một cái gì đó như thế này: (nhưng nó mang lại cho tôi UnsupportedOperationException trên phù hợp với " .... .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()); 
    } 
}; 

I đã thêm dữ liệu vào bản đồ chỉ với chức năng này.

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()); 
+0

Tôi đã sử dụng phương pháp ở đây Nếu bạn nhận được 'ArrayList' trống, hãy đảm bảo bạn đã sửa' ClusterManager' và 'MarkerCollection()'. – bjiang

Trả lời

5

tôi đang tập trung toàn bộ thời gian trên ClusterManager, vì vậy tôi đã quên mất googlemap, và đặc biệt là phương pháp clear(). Tôi đã có thể giải quyết vấn đề với mã này:

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

Đối với tôi điều này là không đủ. Tôi đã xóa và thêm nhiều mục. Kêu gọi điều này sau khi hoạt động đã được giải quyết xong vấn đề của tôi về việc làm mới bị thiếu: mClusterManager.cluster(); - Có thể nó giúp ai đó. – plexus

+0

Như @plexus cho biết một cuộc gọi đến cluster() là cần thiết để đảm bảo các cụm được cập nhật. Và hãy cẩn thận với .clear() bởi vì rất nhiều lần bạn cần phóng to/thu nhỏ để bản đồ cập nhật chính xác. – lujop

6

Theo ClusterManagerdocumentation, chúng ta có thể sử dụng mClusterManager.cluster();

Phương pháp này Buộc một tái cluster. Bạn có thể muốn gọi sau khi thêm mục mới.

1

Không có API nào để thông báo rằng mục cụm đã được cập nhật. Nhưng bạn có thể sử dụng clusterManager.removeItem() + clusterManager.addItem() để buộc cập nhật cho một mục. Tuy nhiên, bạn phải cẩn thận, vì bạn thường muốn cập nhật một mục vì nó đã thay đổi một số thuộc tính ảnh hưởng đến hiển thị, bạn cần sử dụng tùy chỉnh ClusterRenderer hỗ trợ điều này và ghi đè onClusterItemRendered() và/hoặc onClusterRendered(). Sử dụng các biến thể onBefore sẽ không hoạt động vì chúng chỉ được gọi một lần khi tạo điểm đánh dấu.

Bạn có thể xem xét vấn đề GitHub này GitHub issue

1

Kể từ khi ứng dụng của tôi cần phải cập nhật các cụm nhiều lần sau khi bản đồ được tạo ra, tôi thấy công việc này như là giải pháp tốt nhất để loại bỏ và thêm cụm mới:

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

Điều đó sẽ buộc các cụm phải lập lại sau khi sửa đổi nội dung.

Các vấn đề liên quan