2013-05-23 6 views
6

Mam ArrayList niestandardowej klasy. Na liście znajduje się około 10 obiektów, z których każdy zawiera szczegóły takie jak tytuł, fragment, latLng. Udało mi się dodać wszystkie 10 do mapy za pomocą moich niestandardowych funkcji klasy, takich jak getTitle, getSnippet, getLatLng itp.Rozróżnianie różnych znaczników w Maps API v2 (unikalne identyfikatory)

Teraz, gdy kliknę w okno informacyjne (znacznika), chcę być w stanie jakoś WIEM, który obiekt mojej niestandardowej klasy, której odpowiada ten znacznik.

Na przykład, jeśli kliknę na rynek McDonald's, chcę wiedzieć, do którego elementu z mojej tablicy ArrayList należy ten znacznik.

Spoglądam na MarkerOptions i tam nie ma niczego, co pomoże mi zidentyfikować odpowiedni obiekt niestandardowy.

Jeśli pytanie jest zbyt skomplikowane, pozwól mi zrobić to proste:

ArrayList<CustomObj> objects = blah 
map.addMarker(new MarkerOptions().position(new LatLng(
          Double.parseDouble(result.get(i).getCompanyLatLng() 
            .split(",")[0]), Double.parseDouble(result 
            .get(i).getCompanyLatLng().split(",")[1]))) 
            .title(result.get(i).getCompanyName()) 
            .snippet(result.get(i).getCompanyType()) 
            .icon(BitmapDescriptorFactory 
              .fromResource(R.drawable.pin))); 

Teraz gdy zostanie kliknięty, idę do następnej strony. Następna strona musi wiedzieć, KTÓRY został kliknięty obiekt, dzięki czemu mogę wysłać inne szczegóły do ​​tej strony (np. Adresy URL obrazów, które należy załadować itp.).

Jak dodać unikalną liczbę całkowitą lub dowolny identyfikator do mojego znacznika?

+0

mMap.setOnMarkerClickListener (nowa OnMarkerClickListener() \t \t \t { \t \t \t \t \t \t @Override \t \t \t \t \t \t public boolean onMarkerClick (Marker arg0) { \t \t \t \t\t \t if (arg0.getTitle() jest równa ("Nazwa markera 1")). \t \t \t \t \t \t Toast.makeText (MainActivity.this, arg0.getTitle(), 1000) .pokaż(); \t \t \t \t \t \t \t return true; \t \t \t \t \t \t} \t \t \t \t \t \t \t}); możesz użyć znacznika słuchacza, aby sprawdzić i użyć tytułu do porównania, aby wiedzieć, który znacznik został kliknięty. – Raghunandan

+1

:) Tytuły nie zawsze są unikalne w moim przypadku i dlatego nie mogą być użyte do tego celu. – Asim

+0

możesz użyć getId() w tym przypadku. – Raghunandan

Odpowiedz

6

jedna poprawna sposobem jest użycie Map<Marker, CustomObj> który przechowuje wszystkie znaczniki:

Marker marker = map.addMarker(...); 
map.put(marker, result.get(i)); 

iw onInfoWindowClick:

CustomObj obj = map.get(marker); 

Kolejna próba używa Android Maps Extensions, które dodają metodę getData i setData do Marker, aby można było przypisać CustomObj obiekt po utworzeniu znacznika i pobranie go w dowolnym wywołaniu zwrotnym.

+0

Skończyłem z wykorzystaniem rozszerzeń map. Chciałbym, żeby Google to naprawił. – Asim

+0

@Asim Nie sądzę, że to nie jest coś, co wymaga naprawy.Jeśli takie funkcje ('getData' i' setData') znajdowałyby się w oryginalnej bibliotece, wszystkie twoje obiekty musiałyby być "Parcelable", a wysłanie ich przez IPC do Usług Google Play zajęłoby więcej czasu. Korzystanie z "mapy" to dobry sposób na obejście, rozszerzenia map Google Maps tylko zwiększają wygodę tego rozwiązania. –

1

Do zapisania unikalnego identyfikatora użyłem tekstu fragmentu kodu. Jeśli potrzebujesz fragmentu, będzie on dla wyskakującego okienka i tam możesz po prostu stworzyć swój własny (poprzez znalezienie obiektu z ID), więc nie przegapisz go, ale na pewno przegapisz unikalny identyfikator do identyfikacji obiektów.

Aby znaleźć odpowiedni obiekt po prostu iterację nich

for(SomeObject anObject : someObjects) { 
    if(marker.getSnippet().equalsIgnoreCase(anObject.getID())) { 
     //you got at match 
    } 
} 
+0

Ale mam informacje w fragmentach .. Przydatne informacje, które muszą być wyświetlane – Asim

+0

@Asim możesz uzyskać te informacje z obiektu, prawda? Następnie zabierz to stamtąd. Potrzebujesz informacji tylko podczas wyświetlania. – Warpzit

0

myślę korzystając długość i szerokość geograficzną, można to zrobić

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 

     @Override 
     public boolean onMarkerClick(final Marker marker) { 
      LatLng pos = marker.getPosition(); 
      int arryListPosition = getArrayListPosition(pos); 
      return true; 
     } 
    }); 

i metoda getArrayListPosition jest

private int getArrayListPosition(LatLng pos) { 
    for (int i = 0; i < result.size(); i++) { 
     if (pos.latitude == result.get(i).getCompanyLatLng().split(",")[0]) { 
      if (pos.longitude == result.get(i).getCompanyLatLng() 
        .split(",")[1]) 
       return i; 
     } 
    } 
    return 0; 
} 

Ta metoda zwróci pozycję Twojego operatora ArrayList kto był Marker kliknąłeś. i możesz uzyskać dane z tej pozycji.

Nadzieja to pomaga ...

+0

To jest dobry pomysł. Spróbuję i zaznaczę poprawną odpowiedź, jeśli działa dobrze. – Asim

+1

Ale jeśli masz 2 znaczniki w tym samym miejscu, które wkręcasz. Z pewnością nie jest to najlepsza opcja w porównaniu z użyciem tytułu lub fragmentu. – Warpzit

+0

@Warpzit: tak masz rację. Ale jeśli dodajesz 2 lub więcej znaczników w tym samym LatLng, to jaki jest tego cel. Markery służą do wyświetlania jakiegoś punktu na mapie. Więc ten sam Latlng wskaże tę samą pozycję i myślę, że dane dla tego punktu będą takie same dla wszystkich znaczników. –

1

Zgodnie z dyskusją pod poniższym linkiem, Marker.equals i Marker.hashCode czasami nie działają. Na przykład, gdy mapa jest przesuwana lub powiększana, lub jest ponownie uruchamiana/wznawiana.

Add Tag/Identifier to Markers

Więc ID markera jest lepiej niż Marker sam klucz dla HashMap.

Map<String, MyObject> markerMap = new HashMap<String, MyObject>(); 
Marker marker = map.addMarker(...); 
MyObject myObject = new MyObject(); 
markerMap.put(marker.getId(), myObject); 
0

jestem 4 lata późno, by odpowiedzieć, ale ja naprawdę zaskoczony, dlaczego nikt nie mówił o marker.setTag i marker.getTag metody.

Jak napisano w Dokumentach Google API,

Jest to łatwiejsze niż przechowywanie oddzielny Map<Marker, Object>

Mają wprowadzić setTag i getTag aby uniknąć wykorzystania Map<...>. Możesz użyć go w następujący sposób.

Marker marker = map.addMarker(...); 
marker.setTag(result.get(i)); //Store your marker information here. 

//To fetch your object... 
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
    @Override 
    public boolean onMarkerClick(Marker marker) { 
     CustomObj obj = (CustomObj)marker.getTag(); 
     //Your click handle event 
     // Pass the obj to another activity and you are done 
     return false; 
    } 
});