Diferenciar entre diferentes marcadores en Google Maps API v2 (identificadores únicos)

Tengo un ArrayList de una clase de encargo. Hay unos 10 objetos en la lista, cada uno con detalles como Title, Snippet, LatLng. He agregado con éxito todos los 10 a un mapa usando mis funciones de la clase de encargo como getTitle, getSnippet, getLatLng etc.

Ahora, cuando hago clic en la ventana de información (del marcador), quiero poder saber de alguna manera qué objeto de mi clase personalizada corresponde ese marcador.

Por ejemplo, si hago clic en el mercado de McDonald's, quiero poder saber qué elemento de mi ArrayList perteneció ese marcador.

He estado mirando el MarkerOptions y allí no parece ser cualquier cosa adentro allí que puedo utilizar para identificar el objeto de encargo relevante con.

Si la pregunta es demasiado confusa, permítanme que sea sencillo:

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

Ahora, cuando se hace clic en esto, voy a la siguiente página. La siguiente página necesita saber qué objeto se ha hecho clic para poder enviar los demás detalles a esa página (por ejemplo, URL de imagen que deben cargarse, etc.).

¿Cómo añado un número entero único o cualquier identificador a mi marcador?

Una forma correcta es usar Map<Marker, CustomObj> que almacena todos los marcadores:

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

Y en onInfoWindowClick :

 CustomObj obj = map.get(marker); 

Otro intento es utilizar Android Maps Extensions , que añaden el método getData y setData a Marker , por lo que puede asignar su objeto CustomObj después de crear el marcador y recuperarlo en cualquier devolución de llamada.

Utilicé el texto del fragmento para guardar un ID único. Si necesitas el fragmento es para el popup y allí puedes hacer tu propio (encontrando el objeto desde el ID) para que no te lo pierdas, pero sin duda te perderás un identificador único para identificar los objetos.

Para encontrar el objeto correcto simplemente iterar a través de ellos:

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

De acuerdo con la discusión en el siguiente enlace, Marker.equals y Marker.hashCode no funcionan a veces. Por ejemplo, cuando el mapa es panorámico o ampliado, o se reinicia / reanuda.

Añadir etiqueta / identificador a marcadores

Así que el ID de Marcador es una mejor clave que el propio Marcador para un HashMap.

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

Creo que usando la latitud y la longitud, esto podría ser hecho

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

Y el método getArrayListPosition es

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

Este método le devolverá la posición de su ArrayList que es el Marker que ha hecho clic. Y puede obtener datos de esa posición.

Espero eso ayude…

Estoy con 4 años de retraso para responder, pero realmente me sorprendí por qué nadie habló de marker.setTag y el método marker.getTag .

Como se escribe en google API Documentos,

Esto es más fácil que almacenar un Map<Marker, Object> separado Map<Marker, Object>

Han introducido setTag y getTag para evitar el uso de Map<...> . Puede usarlo de la siguiente manera.

 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; } }); 
  • Google Maps API de Android: Error de autorización
  • Cómo adjuntar un marcador flexible en el mapa algo así como Uber y Lyft?
  • Cómo cargar la imagen de la URL de carga de perezosos en Google Maps
  • Google Maps v2 se retrasa tras extraer su fragmento de la pila
  • Cambiar el tamaño del marcador en Google Maps API v2
  • Error al inflar el fragmento de clase
  • Google map android API V2 se estrelló
  • Cómo abrir la navegación en lugar de mapview en android?
  • Android Google Map v2 Ejemplo de código
  • Personalizada coloreada como marcador de mapa en Google Maps API v2 - Android
  • Android: Cómo dibujar las direcciones de la ruta google maps API V2 desde la ubicación actual hasta el destino
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.