2013-05-31 16 views
30

Ich habe Kartenansicht in meinem Fragment. Ich muss die Karte aktualisieren und verschiedene Markierungen basierend auf der Bedingung hinzufügen. Daher sollte ich die letzten Marker aus der Karte entfernen, bevor ich neue Marker hinzufüge.Android, Wie entferne ich alle Markierungen aus Google Map V2?

Eigentlich, vor ein paar Wochen App funktionierte gut und plötzlich war es passiert. Mein Code ist wie folgt:

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

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

Zuletzt es gut funktioniert (vor neu Google Map API von Android-Team in I/O 2013 bekannt geben). Danach habe ich meinen Code angepasst, um diese neue API zu verwenden. Nun, ich weiß nicht, warum diese Methode googleMap.clear(); nicht funktioniert!

Jeder Vorschlag wäre willkommen. Dank

=======

aktualisieren

=======

komplette Code:

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

Gut zu entfernen, ich habe es versucht und 'clear()' Werke. Du musst etwas falsch machen ... – zbr

+0

Ich rufe diese Methode zweimal an. Das erste hat kein Problem. Zum zweiten Mal löscht diese Zeile keine Markierungen und fügt der Karte (zusammen mit alten) neue Markierungen hinzu. Also habe ich verwirrt, was passiert. – Hesam

+1

Vielen Dank für die Bestätigung. Ich werde versuchen, wieder zu überprüfen, vielleicht hast du Recht, ich mache etwas falsch :( – Hesam

Antwort

33

Okay, schließlich fand ich einen Ersatz Weg, um mein Problem zu lösen. Das interessante Problem ist, wenn Sie einen Marker zuweisen, ist ID 'm0'. Wenn Sie es aus der Karte entfernen und einen neuen Marker zuweisen, erwarten Sie, dass die ID "m0" ist, aber "m1". Daher hat es mir gezeigt, dass die ID nicht vertrauenswürdig ist. Also habe ich List<Marker> markerList = new ArrayList<Marker>(); irgendwo in onActivityCreated() meines Fragments definiert.

Dann oben genannten Code mit dem folgenden geändert. hoffe, es hilft anderen, wenn sie ähnliche Probleme mit Markern haben.

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

Wie alle Marker aus 'ArrayList' oder aus' MarkerArray' ohne 'clear()' Methode entfernen –

+0

Es funktioniert für mich + 1.Thanks – Ninja

+0

es wäre gut, wenn Sie zuerst kurz erklären –

15

Wenn Sie „alle Marker, Overlays und Polylinien aus der Karte“, verwenden clear() löschen möchten auf Ihrem GoogleMap.

+2

Ein sehr herzliches Willkommen zu Ihnen lieber Ahmad für den Beitritt zu StackOverflow.Um zu verhindern, dass unten abstimmen, lesen Sie andere Antworten besonders angenommen Antworten, bevor Sie eine Frage beantworten, bitte – Hesam

+1

Es hilft Stackoverflow-Datenbank nicht durch doppelte Antworten boomte. Danke. – Hesam

1

Verwenden map.clear() alle Marker von Google Karte

Verwandte Themen