2013-05-31 12 views
30

Mam widok mapy w moim fragmencie. Muszę odświeżyć mapę i dodać różne znaczniki na podstawie warunku. Powinienem więc usunąć ostatnie znaczniki z mapy przed dodaniem nowych znaczników.Android, Jak usunąć wszystkie znaczniki z Google Map V2?

Właściwie kilka tygodni temu aplikacja działała poprawnie i nagle to się stało. Mój kod jest tak:

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

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

Ostatni raz było w porządku pracy (przed nowym API Map Google Android ogłosić przez zespół w I/O 2013). Jednak potem zaadaptowałem swój kod, aby korzystać z tego nowego interfejsu API. Teraz nie wiem, dlaczego ta metoda nie działa!

Wszelkie sugestie będą mile widziane. Dzięki

=======

Aktualizacja

=======

Kompletny kod:

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

Cóż, próbowałem tego i 'clear()' działa. Musisz zrobić coś złego ... – zbr

+0

Nazywam tę metodę dwa razy. pierwszy nie ma problemu. po raz drugi ta linia nie usuwa znaczników i dodaje nowe znaczniki do mapy (razem ze starszymi). Tak więc myliłem to, co się dzieje. – Hesam

+1

Dziękujemy za potwierdzenie. Spróbuję jeszcze raz sprawdzić, czy masz rację, robię coś złego :( – Hesam

Odpowiedz

33

Dobrze wreszcie znalazłem zamiennik sposób na rozwiązanie mojego problemu. Ciekawym problemem jest przypisanie znacznika do mapy, jego id to "m0". Kiedy usuniesz go z mapy i przypiszesz nowy znacznik, spodziewasz się, że id będzie miał "m0", ale będzie to "m1". Dlatego pokazał mi, że id nie jest zaufany. Tak więc zdefiniowałem List<Marker> markerList = new ArrayList<Marker>(); gdzieś w onActivityCreated() mojego fragmentu.

Następnie zmieniono powyższy kod na następujący. mam nadzieję, że pomoże to innym, jeśli mają podobny problem ze znacznikami.

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

Jak usunąć wszystkie znaczniki z 'ArrayList' lub z' MarkerArray' bez 'clear()' method –

+0

To działa dla mnie + 1.Thanks – Ninja

+0

dobrze by było, gdybyś najpierw wyjaśnił w skrócie: –

15

Jeśli chcesz wyczyścić „wszystkie znaczniki, nakładki i polilinie z mapy”, użyj clear() na GoogleMap.

+2

Bardzo serdecznie witam cię, drogi Ahmadzie, za przyłączenie się do StackOverflow .Aby zapobiec głosowaniu w dół, przeczytaj inne odpowiedzi, które są szczególnie akceptowane, zanim odpowiesz na pytanie, – Hesam

+1

Pomaga to bazie danych Stackoverflow nie boom przez duplikowanie odpowiedzi. – Hesam

1

Użyj map.clear(), aby usunąć wszystkie znaczniki z mapy Google