2013-03-12 14 views
12

zasadzie podczas dodawania znacznika na mapie zwraca nowy marker i możesz dostaje id znacznika z niego jak takUzyskiwanie znacznik mapy przez jego identyfikator w Google Maps v2

Marker m = map.addMarker(new MarkerOptions() 
          .position(new LatLng(lat,lon))); 
String id = m.getId(); 

czy istnieje sposób, aby zdobyć marker według jego identyfikatora, jeśli istnieje wiele znaczników i chcesz go usunąć?

Odpowiedz

19

Problem polega na tym, że identyfikator znacznika jest generowany automatycznie i nie można go użyć do indywidualnego śledzenia znaczników. Zaproponowano różne strategie w tym zakresie. Jednym z nich byłby use a hash map to track markers, a następnie użyj klucza, który wybrałeś, aby znaleźć znacznik specjalny i go usunąć. Innym pomysłem jest przeciążenie jednego z pól znacznika, np. Fragmentu, a następnie samodzielne dodanie klucza. Na przykład, jeśli robili nowy marker (na przykładzie kodu Google) można umieścić swój własny klucz ciąg znaków w polu urywka

mMap.addMarker(new MarkerOptions()       
.position(MELBOURNE)       
.title("Melbourne")       
.snippet(KEY + "Population: 4,137,400")); 

Później można sprowadzaniu tego klucza przy użyciu

String s = marker.getSnippet() 
String key = s.substring(start, end) 

i następnie użyj warunku, aby usunąć określony znacznik, jeśli jest zgodny. W zależności od tego, co musisz zrobić, jedno podejście jest łatwiejsze i bardziej wydajne niż inne.

+0

zobaczyć http://stackoverflow.com/a/15292496 – audric

0

Najlepszym sposobem na to jest użycie Map <int, Mark> dictionaryMark;.

Po prostu dodaj znak do słownika przy każdym jego rysowaniu.

29

mam zrobić w ten sposób:

inicjowanie zmiennych:

private GoogleMap mMap; 
private HashMap<Marker, Integer> mHashMap = new HashMap<Marker, Integer>(); 
private ArrayList<MyCustomModelClass> myList = new ArrayList<MyCustomModelClass>(); 

Dodaj znacznik na mapie google używając ArrayList:

for (int i = 0; i < myList.size(); i++) { 
    double latitude = myList.getLatitude(); 
    double longitude = myList.getLongitude(); 
    Marker marker = mMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude))).title(myList.getTitle()) 
             .icon(BitmapDescriptorFactory.fromResource(R.drawable.location_icon)); 
    mHashMap.put(marker, i); 
} 

Na marker kliknięcie słuchacz:

@Override 
public boolean onMarkerClick(Marker marker) { 
    int pos = mHashMap.get(marker); 
    Log.i("Position of arraylist", pos+""); 
} 

nadzieję, że to pomoże.

+3

Wielką odpowiedź. To jest odpowiednie rozwiązanie. – ADL

+0

@ADL, Cieszę się, że mogę Ci pomóc. :) –

+1

Koleś !!! . Uratowałeś mój dzień :) –

5

Do przechowywania znaczników używamy WeakHashMap<Integer,Marker>, ponieważ w ten sposób nie zachowalibyśmy odniesienia do znacznika w pamięci i nie musielibyśmy się martwić o znaczniki zbierania śmieci.

Drugim zalecanym sposobem wykonania tej czynności jest użycie WeakHashMap z identyfikatorem i niestandardowymi danymi. Dokumentacja mówi, że obiekt znacznika może się zmienić, więc nie używaj znacznika jako klucza. jeśli aktywność zostanie zabita i przywrócona, ale identyfikator pozostanie taki sam. czasami może zwrócić wartość null również w przypadku zmiany obiektów znaczników.

WeakHashMap<Integer,Marker> obj = new WeakHashMap <Integer,Marker>(); 

nadzieję, że pomoże przyszłych widzów ...

+0

Dzięki za alert :) –

Powiązane problemy