2013-05-31 38 views
30

Tôi có chế độ xem bản đồ trong đoạn của mình. Tôi cần làm mới bản đồ và thêm các điểm đánh dấu khác nhau dựa trên điều kiện. Vì vậy, tôi nên xóa các điểm đánh dấu cuối cùng khỏi bản đồ trước khi thêm các điểm đánh dấu mới.Android, Cách xóa tất cả các điểm đánh dấu khỏi Google Map V2?

Thực tế, một vài tuần trước, ứng dụng hoạt động tốt và đột nhiên điều đó xảy ra. Mã của tôi giống như sau:

private void displayData(final List<Venue> venueList) { 

     // Removes all markers, overlays, and polylines from the map. 
     googleMap.clear(); 
. 
. 
. 
} 

Lần trước nó hoạt động tốt (trước khi Google Map API mới công bố bởi nhóm Android trong I/O 2013). Tuy nhiên, sau đó tôi đã điều chỉnh mã của mình để sử dụng API mới này. Bây giờ, tôi không biết tại sao phương pháp này googleMap.clear(); không hoạt động!

Mọi đề xuất sẽ được đánh giá cao. Cảm ơn

=======

Cập nhật

=======

Toàn bộ mã:

private void displayData(final List<Venue> venueList) { 

     // Removes all markers, overlays, and polylines from the map. 
     googleMap.clear(); 

     // Zoom in, animating the camera. 
     googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null); 

     // Add marker of user's position 
     MarkerOptions userIndicator = new MarkerOptions() 
       .position(new LatLng(lat, lng)) 
       .title("You are here") 
       .snippet("lat:" + lat + ", lng:" + lng); 
     googleMap.addMarker(userIndicator); 

     // Add marker of venue if there is any 
     if(venueList != null) { 
      for(int i=0; i < venueList.size(); i++) { 
       Venue venue = venueList.get(i); 
       String guys = venue.getMaleCount(); 
       String girls= venue.getFemaleCount(); 
       String checkinStatus = venue.getCan_checkin(); 
       if(checkinStatus.equalsIgnoreCase("true")) 
        checkinStatus = "Checked In - "; 
       else 
        checkinStatus = ""; 

       MarkerOptions markerOptions = new MarkerOptions() 
         .position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude()))) 
         .title(venue.getName()) 
         .snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls) 
         .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin)); 

       googleMap.addMarker(markerOptions); 
      } 
     } 

     // Move the camera instantly to where lat and lng shows. 
     if(lat != 0 && lng != 0) 
      googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL)); 

     googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 
      @Override 
      public View getInfoWindow(Marker marker) { 
       return null; 
      } 

      @Override 
      public View getInfoContents(Marker marker) { 
       return null; 
      } 
     }); 

     googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { 
      @Override 
      public void onInfoWindowClick(Marker marker) { 
       String str = marker.getId(); 
       Log.i(TAG, "Marker id: " + str); 
       str = str.substring(1); 
       int markerId = Integer.parseInt(str); 
       markerId -= 1; // Because first item id of marker is 1 while list starts at 0 
       Log.i(TAG, "Marker id " + markerId + " clicked."); 

       // Ignore if User's marker clicked 
       if(markerId < 0) 
        return; 

       try { 
        Venue venue = venueList.get(markerId); 
        if(venue.getCan_checkin().equalsIgnoreCase("true")) { 
         Fragment fragment = VenueFragment.newInstance(venue); 
         if(fragment != null) 
          changeFragmentLister.OnReplaceFragment(fragment); 
         else 
          Log.e(TAG, "Error! venue shouldn't be null"); 
        } 
       } catch(NumberFormatException e) { 
        e.printStackTrace(); 
       } catch(IndexOutOfBoundsException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
+2

Vâng, tôi đã thử nó và 'clear()' hoạt động. Bạn phải làm điều gì đó sai ... – zbr

+0

Tôi gọi phương thức này hai lần. đầu tiên không có vấn đề gì. lần thứ hai dòng này không xóa các điểm đánh dấu và thêm các điểm đánh dấu mới vào bản đồ (cùng với các điểm cũ). Vì vậy, tôi bối rối những gì đang xảy ra. – Hesam

+1

Cảm ơn bạn đã xác nhận. Tôi sẽ cố gắng kiểm tra lại có lẽ bạn đang đúng Tôi đang làm điều gì đó sai: ( – Hesam

Trả lời

33

Được rồi cuối cùng tôi đã tìm thấy một sự thay thế cách để giải quyết vấn đề của tôi. Vấn đề thú vị là khi bạn gán một điểm đánh dấu cho bản đồ, id của nó là 'm0'. Khi bạn xóa nó khỏi bản đồ và gán điểm đánh dấu mới, bạn mong muốn id phải là 'm0' nhưng đó là 'm1'. Do đó, nó cho tôi thấy id không đáng tin cậy. Vì vậy, tôi đã xác định List<Marker> markerList = new ArrayList<Marker>(); ở đâu đó trong onActivityCreated() đoạn của tôi.

Sau đó thay đổi mã ở trên bằng mã sau. hy vọng nó sẽ giúp người khác nếu họ có vấn đề tương tự với các dấu hiệu.

private void displayData(final List<Venue> venueList) { 
     Marker marker; 

     // Removes all markers, overlays, and polylines from the map. 
     googleMap.clear(); 
     markerList.clear(); 

     // Zoom in, animating the camera. 
     googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null); 

     // Add marker of user's position 
     MarkerOptions userIndicator = new MarkerOptions() 
       .position(new LatLng(lat, lng)) 
       .title("You are here") 
       .snippet("lat:" + lat + ", lng:" + lng); 
     marker = googleMap.addMarker(userIndicator); 
//  Log.e(TAG, "Marker id '" + marker.getId() + "' added to list."); 
     markerList.add(marker); 

     // Add marker of venue if there is any 
     if(venueList != null) { 
      for (Venue venue : venueList) { 
       String guys = venue.getMaleCount(); 
       String girls = venue.getFemaleCount(); 
       String checkinStatus = venue.getCan_checkin(); 
       if (checkinStatus.equalsIgnoreCase("true")) 
        checkinStatus = "Checked In - "; 
       else 
        checkinStatus = ""; 

       MarkerOptions markerOptions = new MarkerOptions() 
         .position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude()))) 
         .title(venue.getName()) 
         .snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls) 
         .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin)); 

       marker = googleMap.addMarker(markerOptions); 
//    Log.e(TAG, "Marker id '" + marker.getId() + "' added to list."); 
       markerList.add(marker); 
      } 
     } 

     // Move the camera instantly to where lat and lng shows. 
     if(lat != 0 && lng != 0) 
      googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL)); 

     googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 
      @Override 
      public View getInfoWindow(Marker marker) { 
       return null; 
      } 

      @Override 
      public View getInfoContents(Marker marker) { 
       return null; 
      } 
     }); 

     googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { 
      @Override 
      public void onInfoWindowClick(Marker marker) { 
       int markerId = -1; 

       String str = marker.getId(); 
       Log.i(TAG, "Marker id: " + str); 
       for(int i=0; i<markerList.size(); i++) { 
        markerId = i; 
        Marker m = markerList.get(i); 
        if(m.getId().equals(marker.getId())) 
         break; 
       } 

       markerId -= 1; // Because first item of markerList is user's marker 
       Log.i(TAG, "Marker id " + markerId + " clicked."); 

       // Ignore if User's marker clicked 
       if(markerId < 0) 
        return; 

       try { 
        Venue venue = venueList.get(markerId); 
        if(venue.getCan_checkin().equalsIgnoreCase("true")) { 
         Fragment fragment = VenueFragment.newInstance(venue); 
         if(fragment != null) 
          changeFragmentLister.OnReplaceFragment(fragment); 
         else 
          Log.e(TAG, "Error! venue shouldn't be null"); 
        } 
       } catch(NumberFormatException e) { 
        e.printStackTrace(); 
       } catch(IndexOutOfBoundsException e) { 
        e.printStackTrace(); 
       } catch (NullPointerException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
+1

Làm thế nào để loại bỏ tất cả các dấu hiệu từ 'ArrayList' hoặc từ' MarkerArray' mà không có 'clear()' phương pháp –

+0

Nó hoạt động cho tôi + 1.Thanks – Ninja

+0

nó sẽ tốt nếu bạn lần đầu tiên giải thích ngắn gọn –

15

Nếu bạn muốn xóa "tất cả đánh dấu, lớp phủ và polylines khỏi bản đồ", hãy sử dụng clear() trên GoogleMap của bạn.

+2

Một lời chào mừng rất nồng nhiệt đối với bạn thân yêu Ahmad đã tham gia StackOverflow Để tránh bị bỏ phiếu, hãy đọc các câu trả lời đặc biệt khác được chấp nhận trước khi trả lời một câu hỏi, vui lòng – Hesam

+1

Nó giúp cơ sở dữ liệu Stackoverflow không bị bùng nổ bởi câu trả lời trùng lặp. – Hesam

1

Sử dụng map.clear() để xóa tất cả các điểm đánh dấu khỏi bản đồ Google

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