2013-05-23 13 views
6

Ho una lista array di una classe personalizzata. Ci sono circa 10 oggetti nella lista, ognuno con dettagli come Titolo, Snippet, LatLng. Ho aggiunto con successo tutti i 10 ad una mappa utilizzando le funzioni di classe personalizzati come getTitle, getSnippet, getLatLng eccDifferenzia tra diversi marcatori in Maps API v2 (identificatori univoci)

Ora, quando si fa clic la finestra di informazioni (del marcatore), voglio essere in grado di sapere in qualche modo che oggetto della mia classe personalizzata corrisponde a quell'indicatore.

Ad esempio, se faccio clic sul mercato di McDonald's, voglio essere in grado di sapere a quale elemento del mio ArrayList è appartenuto quel marcatore.

Ho guardato MarkerOptions e sembra che non ci sia nulla che possa essere utilizzato per identificare l'oggetto personalizzato pertinente con.

Se la domanda è troppo confusa, permettetemi di fare le cose semplici:

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))); 

Ora, quando questo viene cliccato, vado alla pagina successiva. La pagina successiva ha bisogno di sapere quale oggetto è stato cliccato in modo da poter inviare gli altri dettagli a quella pagina (ad esempio URL immagine che devono essere caricati, ecc.).

Come si aggiunge un numero intero univoco o un identificatore qualsiasi al mio indicatore?

+0

mMap.setOnMarkerClickListener (nuova OnMarkerClickListener() \t \t \t { \t \t \t \t \t \t @Override \t \t \t \t \t \t onMarkerClick public boolean (Marker arg0) { \t \t \t \t \t \t \t se (arg0.getTitle() equals ("marker 1 titolo").) \t \t \t \t \t \t Toast.makeText (MainActivity.this, arg0.getTitle(), 1000) .Show(); \t \t \t \t \t \t \t return true; \t \t \t \t \t \t} \t \t \t \t \t \t \t}); puoi usare marker listener per controllare e usare il titolo per confrontare per sapere quale marker è stato cliccato – Raghunandan

+1

:) I titoli non sono sempre unici nel mio caso e quindi non possono essere utilizzati a questo scopo. – Asim

+0

in questo caso è possibile utilizzare getId(). – Raghunandan

risposta

6

Un modo corretto è quello di utilizzare Map<Marker, CustomObj> che memorizza tutti i marcatori:

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

e in onInfoWindowClick:

CustomObj obj = map.get(marker); 

Un'altra prova sta usando Android Maps Extensions, che aggiunge il metodo getData e setData a Marker, quindi è possibile CustomObj oggetto dopo aver creato un indicatore e recuperarlo in qualsiasi callback.

+0

Ho finito per usare le estensioni delle mappe. Vorrei che Google aggiustasse questo. – Asim

+0

@Asim Non penso che questo non sia qualcosa che richiede una correzione.Se tali funzioni ('getData' e' setData') erano all'interno della libreria originale, tutti gli oggetti dovrebbero essere 'Parcelable' e ci vorrebbe più tempo per inviarli tramite IPC a Google Play Services. L'utilizzo di 'Map' è una buona soluzione, le estensioni di Maps per Android rendono questa soluzione ancora più comoda. –

1

Ho utilizzato il testo snippet per il salvataggio di un ID univoco. Se hai bisogno dello snippet sarà per il popup e lì puoi semplicemente crearne uno (trovando l'oggetto dall'ID) in modo da non perderlo ma ti mancherà sicuramente un ID univoco per identificare gli oggetti.

per trovare l'oggetto giusto Ho appena iterare attraverso di loro:

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

Ma ho informazioni in frammenti .. Informazioni utili che devono essere visualizzate – Asim

+0

@Asim è possibile ottenere le informazioni dall'oggetto pure giusto? Quindi prendilo da lì. Hai solo bisogno delle informazioni quando la stai visualizzando. – Warpzit

0

Penso che utilizzando latitudine e longitudine, questo potrebbe essere fatto

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 

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

e il metodo getArrayListPosition è

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; 
} 

Questo metodo ti restituirà la posizione del tuo ArrayList chi ha fatto clic su Marker. e puoi ottenere dati da quella posizione.

Speranza che aiuta ...

+0

Questa è una buona idea. Farò un tentativo e segna la tua risposta corretta se funziona bene. – Asim

+1

Ma se hai 2 segnalini nello stesso posto in cui ti sei avvitato. Questa non è certamente l'opzione migliore rispetto all'uso del titolo o dello snippet. – Warpzit

+0

@Warpzit: sì hai ragione. Ma se stai aggiungendo 2 o più marker allo stesso LatLng, qual è lo scopo. I marker sono utilizzati per visualizzare un punto sulla mappa. Quindi lo stesso Latlng indicherà la stessa posizione e penso che i dati per quel punto saranno uguali per tutti i marcatori. –

1

In base alla discussione al seguente link, Marker.equals e Marker.hashCode non funzionano a volte. Ad esempio, quando la mappa viene ingrandita o ingrandita, oppure viene riavviata/ripresa.

Add Tag/Identifier to Markers

Così ID di Marker è una chiave di meglio di sé Marker per un HashMap.

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

I am 4 anni di ritardo per rispondere, ma ho davvero stupito perché nessuno parlato marker.setTag e marker.getTag metodo.

Come scritto in google docs API,

Questo è più facile che la memorizzazione di un separato Map<Marker, Object>

Hanno introdurre setTag e getTag per evitare l'uso di Map<...>. Puoi usarlo come segue.

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; 
    } 
}); 
Problemi correlati