Obtener otros valores de marcador

Estoy atascado con este problema y espero que alguien me puede llevar a una solución, he pasado 3 días en él hasta ahora ..

El problema

Tengo 2 actividades, la actividad A es un listview poblado de una lista de JSON. Actividad B es mapas de Google v2 basado en la misma lista json pero su en el mapa no en la lista.

En la actividad Una lista allí es onItemclicklistener y cuando hago clic en él muestra otra actividad y sus trabajos muy bien. No hay problema aquí. Todo funciona como se supone también.

En la actividad B hay un fragmento de mapa, y está lleno de lat-lng valores de una lista JSON también. Así que hay 10 + marcadores en el mapa. Tan cuando hago clic en el marcador, estoy consiguiendo el nombre y la dirección y su funcionamiento muy bien también.

Esto es lo que quiero

Cuando hago clic en el elemento de la lista que me lleva a la actividad C. Y hay algunas textviews para mostrar qué días la compañía está abierta. Este paso está hecho, su trabajo bien y todo lo que se supone que también.

Cuando hago clic en Mapa, hay marcadores, Así que tengo onInfoWindowClick() . Está muy bien también, pero ¿cómo puedo obtener más valores de la onInfoWindowClick() ?

Lo que quiero decir es, puedo conseguir (getSnippet y getTitle de marcador) Pero tengo otros valores en la lista, como nombre, días, id's. Esto lo que obtengo es sólo .getsnippet y getTitle a través del marcador.

Estoy muy atascado con este problema. Realmente quiero hacer lo mismo como en la Lista. Cuando presiono en la lista de su obtención de todos los valores, pero cuando estoy en Maps sólo puedo obtener la ventana de marcador con el título y el fragmento. Lo siento si no podía explicar bueno, pls siéntase libre de preguntarme si hay más código que desea ver demasiado.

  for (HashMap<String, String> hashMap : contactList) { map.addMarker(new MarkerOptions() .position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG)))) .title(hashMap.get(TAG_ADDRESS)) .snippet(hashMap.get(TAG_NAME)) ); 

 @Override public void onInfoWindowClick(Marker marker) { marker.getTitle(); marker.getSnippet(); } 

CÓDIGO ACTUALIZADO

  public class MapBased extends AbstractMapActivity implements OnNavigationListener,OnInfoWindowClickListener { private static final String TAG_Location = "location_id"; private static final String TAG_Company = "company_id"; private static final String TAG_PLACE = "place"; private static final String TAG_POSTAL = "postal"; private static final String TAG_CITY = "city"; private static final String TAG_MONDAY = "monday"; private static final String TAG_TUESDAY = "tuesday"; private static final String TAG_WEDNESDAY = "wednesday"; private static final String TAG_THURSDAY = "thursday"; private static final String TAG_FRIDAY = "friday"; private static final String TAG_SATURDAY = "saturday"; private static final String TAG_SUNDAY = "sunday"; private static final String TAG_TYPE = "type"; private static final String TAG_NOCAR = "nocar"; private static final String TAG_NAME = "name"; private static final String TAG_LAT = "lat"; private static final String TAG_LNG = "lng"; private static final String TAG_ADDRESS = "address"; private static final String TAG = "Debug of Project"; // private String a; private String b; private double my_lat; private double my_lng; private static final String STATE_NAV="nav"; private static final int[] MAP_TYPE_NAMES= { R.string.normal, R.string.hybrid, R.string.satellite, R.string.terrain }; private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE, GoogleMap.MAP_TYPE_TERRAIN }; private GoogleMap map=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SQLiteDatabase db = openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null); db.execSQL("CREATE TABLE IF NOT EXISTS gps_kordinater (ID INTEGER PRIMARY KEY AUTOINCREMENT, Latitude REAL, Longitude REAL);"); String query = "SELECT Latitude,Longitude FROM gps_kordinater WHERE Id = (SELECT MAX(Id) FROM gps_kordinater)"; Cursor cursor = db.rawQuery(query, null); if(cursor != null) { cursor.moveToFirst(); a = cursor.getString(0); b = cursor.getString(1); } String url = "http://example.com"; my_lat = Double.valueOf(a); my_lng = Double.valueOf(b); db.close(); // now enabled if disabled = ingen support for jb aka 4.0 if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>(); JSONParser jParser = new JSONParser(); JSONArray json = jParser.getJSONFromUrl(url); try { for(int i = 0; i < json.length(); i++){ JSONObject c = json.getJSONObject(i); String lat = c.getString(TAG_LAT); String lng = c.getString(TAG_LNG); String name = c.getString(TAG_NAME); String adresse = c.getString(TAG_ADDRESS); String location_id = c.getString(TAG_Location); String company_id = c.getString(TAG_Company); String place = c.getString(TAG_PLACE) ; String postal = c.getString(TAG_POSTAL); String city = c.getString(TAG_CITY); String monday = c.getString(TAG_MONDAY); if(c.getString(TAG_MONDAY).isEmpty()) { monday="Lukket"; } else { monday=c.getString(TAG_MONDAY); } String tuesday = c.getString(TAG_TUESDAY); if(c.getString(TAG_TUESDAY).isEmpty()) { tuesday="Lukket"; } else { tuesday=c.getString(TAG_TUESDAY); } String wednesday = c.getString(TAG_WEDNESDAY); if(c.getString(TAG_WEDNESDAY).isEmpty()) { wednesday="Lukket"; } else { wednesday=c.getString(TAG_WEDNESDAY); } String thursday = c.getString(TAG_THURSDAY); if(c.getString(TAG_THURSDAY).isEmpty()) { thursday="Lukket"; } else { thursday=c.getString(TAG_THURSDAY); } String friday = c.getString(TAG_FRIDAY); if(c.getString(TAG_FRIDAY).isEmpty()) { friday="Lukket"; } else { friday=c.getString(TAG_FRIDAY); } String saturday = c.getString(TAG_SATURDAY); if(c.getString(TAG_SATURDAY).isEmpty()) { saturday="Lukket"; } else { saturday=c.getString(TAG_SATURDAY); } String sunday=c.getString(TAG_SUNDAY); if(c.getString(TAG_SUNDAY).isEmpty()) { sunday="Lukket"; } else { sunday=c.getString(TAG_SUNDAY); } String nocar = c.getString(TAG_NOCAR); String type = c.getString(TAG_TYPE); // creating new HashMap HashMap<String, String> map2 = new HashMap<String, String>(); // adding each child node to HashMap key => value map2.put(TAG_LAT, lat); map2.put(TAG_LNG, lng); map2.put(TAG_NAME, name); map2.put(TAG_ADDRESS, adresse); map2.put(TAG_Location, location_id); map2.put(TAG_Company, company_id); map2.put(TAG_PLACE, place); map2.put(TAG_POSTAL, postal); map2.put(TAG_CITY, city); map2.put(TAG_MONDAY, monday); map2.put(TAG_TUESDAY, tuesday); map2.put(TAG_WEDNESDAY, wednesday); map2.put(TAG_THURSDAY, thursday); map2.put(TAG_FRIDAY, friday); map2.put(TAG_SATURDAY, saturday); map2.put(TAG_SUNDAY, sunday); map2.put(TAG_TYPE, type); map2.put(TAG_NOCAR, nocar); // adding HashList to ArrayList contactList.add(map2); Log.d(TAG, "Hashmap 1: " + map2); Log.d(TAG, "Hashmap 2: " + map2.values()); Log.d(TAG, "array 4: " + contactList); } Log.d(TAG, "array 5: " + contactList); } catch (JSONException e) { e.printStackTrace(); Log.e("JSON Parser", "Error parsing data " + e.toString()); } if (readyToGo()) { setContentView(R.layout.map_based); SupportMapFragment mapFrag= (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map2); initListNav(); map=mapFrag.getMap(); CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(my_lat , my_lng)); CameraUpdate zoom=CameraUpdateFactory.zoomTo(10); map.moveCamera(center); map.animateCamera(zoom); for (HashMap<String, String> hashMap : contactList) { map.addMarker(new MarkerOptions() .position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG)))) .title(hashMap.get(TAG_ADDRESS)) .snippet(hashMap.get(TAG_NAME)) ); } map.setInfoWindowAdapter(new PopupMapBasedAdapter(getLayoutInflater())); map.setOnInfoWindowClickListener(this); } Button btn_web = (Button) findViewById(R.id.footer_list_btn); btn_web.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //myVib.vibrate(50); finish(); } }); } @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { map.setMapType(MAP_TYPES[itemPosition]); return(true); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt(STATE_NAV,getSupportActionBar().getSelectedNavigationIndex()); } @Override public void onInfoWindowClick(Marker marker) { marker.getTitle(); marker.getSnippet(); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV)); } private void initListNav() { ArrayList<String> items=new ArrayList<String>(); ArrayAdapter<String> nav=null; ActionBar bar=getSupportActionBar(); for (int type : MAP_TYPE_NAMES) { items.add(getString(type)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { nav= new ArrayAdapter<String>( bar.getThemedContext(), android.R.layout.simple_spinner_item, items); } else { nav= new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, items); } nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); bar.setListNavigationCallbacks(nav, this); } } 

No puedes agregar más datos al marcador, a menos que lo pongas en el fragmento.

Así que si desea agregar más datos a su marcador, tendrá que almacenarlo en una variable externa que está vinculada a su marcador.

Cada marcador hecho tiene una identificación única.

Puede utilizar esta información para guardar los datos adicionales asignados a este ID en una variable independiente.

Ejemplo:

Cree una variable a la que puede acceder:

  /** * Create your variable where you store all your data mapped to the marker ID, * make it accessible where you want. * The key of this hashmap is your marker ID, the value is another Map with extra data */ HashMap<String, HashMap> extraMarkerInfo = new HashMap<String, HashMap>(); 

OPCIÓN 1 Cambie su código de marcador para agregar datos adicionales a esta variable

 for (HashMap<String, String> hashMap : contactList) { // Create your marker like normal, nothing changes Marker marker = map.addMarker(new MarkerOptions() .position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG)))) .title(hashMap.get(TAG_ADDRESS)) .snippet(hashMap.get(TAG_NAME))); // When you created the marker you store the extra data from your JSON in another variable (HashMap for example) HashMap<String, String> data = new HashMap<String, String>(); data.put(TAG_Location,hashMap.get(TAG_Location)); data.put(TAG_Company,hashMap.get(TAG_Company)); data.put(TAG_PLACE,hashMap.get(TAG_PLACE)); data.put(TAG_POSTAL,hashMap.get(TAG_POSTAL)); data.put(TAG_CITY,hashMap.get(TAG_CITY)); data.put(TAG_MONDAY,hashMap.get(TAG_MONDAY)); data.put(TAG_TUESDAY,hashMap.get(TAG_TUESDAY)); data.put(TAG_WEDNESDAY,hashMap.get(TAG_WEDNESDAY)); data.put(TAG_THURSDAY,hashMap.get(TAG_THURSDAY)); data.put(TAG_FRIDAY,hashMap.get(TAG_FRIDAY)); data.put(TAG_SATURDAY,hashMap.get(TAG_SATURDAY)); data.put(TAG_SUNDAY,hashMap.get(TAG_SUNDAY)); data.put(TAG_TYPE,hashMap.get(TAG_TYPE)); data.put(TAG_NOCAR,hashMap.get(TAG_NOCAR)); // Save this marker data in your previously made HashMap mapped to the marker ID. So you can get it back based on the marker ID extraMarkerInfo.put(marker.getId(),data); } 

EASY OPTION 2 Sólo guarda el mapa completo en la variable externa

 for (HashMap<String, String> hashMap : contactList) { // Create your marker like normal, nothing changes Marker marker = map.addMarker(new MarkerOptions() .position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG)))) .title(hashMap.get(TAG_ADDRESS)) .snippet(hashMap.get(TAG_NAME))); // Just save the entire json hashmap into the external variable extraMarkerInfo.put(marker.getId(),hashMap); } 

Ahora usted puede tener acceso a ese extraMarkerInfo cuando usted quiere, usted sabe el identificador del marcador usando getID() .

 @Override public void onInfoWindowClick(Marker marker) { String title = marker.getTitle(); String snippet = marker.getSnippet(); // Get extra data with marker ID HashMap<String, String> marker_data = extraMarkerInfo.get(marker.getId()); // Getting the data from Map String location = marker_data.get(TAG_Location); String company = marker_data.get(TAG_Company); String place = marker_data.get(TAG_PLACE); //.. etc etc } 

Este es sólo un pequeño ejemplo usando HashMaps, pero puede utilizar diferentes soluciones lo que prefiera.

Supongo que usted tiene que tener una lista con toda la información que usted también tiene en su ListAcivity en MapActivity. Cuando un usuario hace clic en un marcador, busca ese objeto en particular (supongo que es contactos) en su lista y obtener el resto de la información que necesita.

 @Override public boolean onMarkerClick(Marker marker) { // TODO Auto-generated method stub String selected_marker=marker.getTitle(); return false; } 

Entonces su puede trabajar basado en qué marcador se hace clic (qué operación desea). Aquí se sabe qué marcador se hace clic …

Una manera realmente agradable y fácil de hacer esto es – siempre que agregue un marcador a su mapa, haga una referencia a él en algo como HashMap<Marker, <WhateverDataYouNeed> extraMarkerData

Luego, cuando quiera sus datos, todo lo que tiene que hacer es llamar a extraMarkerData.get(<yourMarker>) para devolverlo. Simples

Gracias a este tipo tipo que escribió un tutorial, lo encontré bastante extenso para lo que necesitaba, pero proporcionó la idea simple:

http://bon-app-etit.blogspot.be/2012/12/add-informationobject-to-marker-in.html

Mis datos adicionales se parecen a esto:

 private HashMap<Marker,HashMap<String,String>> markerUserData; 

Entonces cuando agrego un marcador a mi mapa, me aseguro de hacer una referencia a sus datos usando el marcador como una llave

 Marker marker = map.addMarker(new MarkerOptions() .position(new LatLng(<lat>,<lng>) .title(<markerTitle>) .snippet(<markerSnippet>) ); markerUserData.put(marker,<myExtraMarkerDataHashMap>); //add reference to marker data 

Y ya que tengo mi propia clase para manejar OnInfoWindowClickListener , he hecho un getter público

 public HashMap<String,String> getDataforMarker(Marker marker){ return extraMarkerData.get(marker); } 

OnInfoWindowClickListener:

 @Override public void onInfoWindowClick(Marker marker) { Log.i("SFCT","Data for marker = "+activity.getDataforMarker(marker)); } 
  • Añadir Marcador en Android Google Map mediante toque o toque
  • Icono de marcador personalizado de Android
  • Mostrar ventana de información en cada marcador a la vez
  • Cómo centrar el mapa en el marcador haga clic para mostrar todo InfoWindow
  • AudioTrack - ¿Cómo saber cuándo empieza o termina un sonido?
  • ¿Marcador de mapa de Android?
  • Deshabilitar onMarkerClickListener completamente en Google Maps API v2
  • Utilidad de Google Maps: cómo obtener todos los marcadores de ClusterManager <?>?
  • Zoom sobre la ruta específica google map
  • Ajuste el centro del marcador en el GeoPoint
  • Android MapView no puede eliminar marcador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.