Android – MapView contenido en un ListView

Actualmente estoy intentando colocar un MapView dentro de un ListView. ¿Alguien ha tenido éxito con esto? ¿Es posible? Aquí está mi código:

ListView myList = (ListView) findViewById(android.R.id.list); List<Map<String, Object>> groupData = new ArrayList<Map<String, Object>>(); Map<String, Object> curGroupMap = new HashMap<String, Object>(); groupData.add(curGroupMap); curGroupMap.put("ICON", R.drawable.back_icon); curGroupMap.put("NAME","Go Back"); curGroupMap.put("VALUE","By clicking here"); Iterator it = data.entrySet().iterator(); while (it.hasNext()) { //Get the key name and value for it Map.Entry pair = (Map.Entry)it.next(); String keyName = (String) pair.getKey(); String value = pair.getValue().toString(); if (value != null) { //Add the parents -- aka main categories curGroupMap = new HashMap<String, Object>(); groupData.add(curGroupMap); //Push the correct Icon if (keyName.equalsIgnoreCase("Phone")) curGroupMap.put("ICON", R.drawable.phone_icon); else if (keyName.equalsIgnoreCase("Housing")) curGroupMap.put("ICON", R.drawable.house_icon); else if (keyName.equalsIgnoreCase("Website")) curGroupMap.put("ICON", R.drawable.web_icon); else if (keyName.equalsIgnoreCase("Area Snapshot")) curGroupMap.put("ICON", R.drawable.camera_icon); else if (keyName.equalsIgnoreCase("Overview")) curGroupMap.put("ICON", R.drawable.overview_icon); else if (keyName.equalsIgnoreCase("Location")) curGroupMap.put("ICON", R.drawable.map_icon); else curGroupMap.put("ICON", R.drawable.icon); //Pop on the Name and Value curGroupMap.put("NAME", keyName); curGroupMap.put("VALUE", value); } } curGroupMap = new HashMap<String, Object>(); groupData.add(curGroupMap); curGroupMap.put("ICON", R.drawable.back_icon); curGroupMap.put("NAME","Go Back"); curGroupMap.put("VALUE","By clicking here"); //Set up adapter mAdapter = new SimpleAdapter( mContext, groupData, R.layout.exp_list_parent, new String[] { "ICON", "NAME", "VALUE" }, new int[] { R.id.photoAlbumImg, R.id.rowText1, R.id.rowText2 } ); myList.setAdapter(mAdapter); //Bind the adapter to the list 

¡¡Gracias de antemano por tu ayuda!!

5 Solutions collect form web for “Android – MapView contenido en un ListView”

En ese caso, añadiría el MapView a la lista tal como lo haría con cualquier otra vista. Aquí hay un rápido tutorial sobre cómo crear un adaptador de lista personalizada. Pero tengo que advertirle, un MapView es una vista bastante pesada y si intenta conseguir un montón de ellos en la pantalla que va a notar la aplicación es lento! Sólo puede añadir un botón al elemento de lista que lleva al usuario a otra página con más información, incluido un mapa.

Para publicar una solución alternativa a una respuesta bastante antigua (más de 2 años en realidad), pero pensé que esto podría ayudar a alguien que podría tropezar en este post como lo hice.

NOTA: Esto puede ser útil para alguien que simplemente necesita mostrar la ubicación en un "Mapa" pero no necesita interactuar con él en el ListView . El Mapa actual se puede mostrar, por ejemplo, en una página de detalles , después de hacer clic en un elemento del ListView

Como ya se ha señalado por @CaseyB, MapView es una especie de vista pesada. Para contrarrestar ese aspecto (y para hacer la vida un poco pero más fácil para mí ;-)), decidí crear una URL como lo haría para un Google Map estático, utilizando varios parámetros que son necesarios para mi aplicación. Puedes obtener más opciones aquí: https://developers.google.com/maps/documentation/staticmaps/

Primero, cuando estoy construyendo los datos para mi ListView , paso datos tales como la latitud y la longitud a una secuencia con algunas variables estáticas tomadas del acoplamiento mencionado arriba. Recibo mis coordenadas de la API de Facebook.

El código que utilizo para construir el enlace:

 String getMapURL = "http://maps.googleapis.com/maps/api/staticmap?zoom=18&size=560x240&markers=size:mid|color:red|" + JOLocation.getString("latitude") + "," + JOLocation.getString("longitude") + "&sensor=false"; 

La URL construida anteriormente, cuando se utiliza en un navegador, devuelve un archivo .PNG . Luego, en mi adapter para la actividad, utilizo @ La carga perezosa de Fedor para mostrar la imagen generada a partir de la URL construida anteriormente para mostrarla en el ListView personalizado. Por supuesto, puede elegir su propio método para mostrar este Map (la imagen del mapa en realidad).

Un ejemplo del resultado final.

Introduzca aquí la descripción de la imagen

En la actualidad, tengo unos 30 Checkin mapas extraño (lo uso en conjunto con el SDK de Facebook) en este ListView , pero los usuarios pueden tener 100 de ellos y no ha habido absolutamente ningún informe de que ralentizar.

Sospecho que esto podría no ayudar al OP considerando el tiempo que ha pasado desde la pregunta, pero espero que ayude a otros usuarios a aterrizar en esta página en el futuro.

En primer lugar, no creo que la visualización de varios MapViews a la vez funcione. MapActivity documenta que sólo se admite uno por proceso:

"Sólo se admite un MapActivity por proceso y es posible que varias MapActivities que se ejecuten simultáneamente interfieran de forma inesperada e indeseada".

( http://code.google.com/android/add-ons/google-apis/reference/index.html )

No dice explícitamente que no puede tener varios MapViews dentro de MapActivity, pero creo que interferirán también, independientemente de qué tipo de ViewGroup padre estén.

En segundo lugar, podría considerar el uso de la API de mapas estáticos para obtener una imagen simple para su inclusión en el ListView – un MapView completo puede ser innecesariamente pesado en cualquier caso:

http://code.google.com/apis/maps/documentation/staticmaps/

El único problema que puede enfrentar es que la API de Static Maps limita el uso por "usuario", lo que probablemente significa por IP (no requiere una clave de API), y las redes móviles pueden ser problemáticas con la limitación de uso de IP. No estoy seguro de exactamente cómo va a jugar.

Es posible, a partir del propio código GoogleMapSample:

 /** * This shows to include a map in lite mode in a ListView. * Note the use of the view holder pattern with the * {@link com.google.android.gms.maps.OnMapReadyCallback}. */ public class LiteListDemoActivity extends AppCompatActivity { private ListFragment mList; private MapAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lite_list_demo); // Set a custom list adapter for a list of locations mAdapter = new MapAdapter(this, LIST_LOCATIONS); mList = (ListFragment) getSupportFragmentManager().findFragmentById(R.id.list); mList.setListAdapter(mAdapter); // Set a RecyclerListener to clean up MapView from ListView AbsListView lv = mList.getListView(); lv.setRecyclerListener(mRecycleListener); } /** * Adapter that displays a title and {@link com.google.android.gms.maps.MapView} for each item. * The layout is defined in <code>lite_list_demo_row.xml</code>. It contains a MapView * that is programatically initialised in * {@link #getView(int, android.view.View, android.view.ViewGroup)} */ private class MapAdapter extends ArrayAdapter<NamedLocation> { private final HashSet<MapView> mMaps = new HashSet<MapView>(); public MapAdapter(Context context, NamedLocation[] locations) { super(context, R.layout.lite_list_demo_row, R.id.lite_listrow_text, locations); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ViewHolder holder; // Check if a view can be reused, otherwise inflate a layout and set up the view holder if (row == null) { // Inflate view from layout file row = getLayoutInflater().inflate(R.layout.lite_list_demo_row, null); // Set up holder and assign it to the View holder = new ViewHolder(); holder.mapView = (MapView) row.findViewById(R.id.lite_listrow_map); holder.title = (TextView) row.findViewById(R.id.lite_listrow_text); // Set holder as tag for row for more efficient access. row.setTag(holder); // Initialise the MapView holder.initializeMapView(); // Keep track of MapView mMaps.add(holder.mapView); } else { // View has already been initialised, get its holder holder = (ViewHolder) row.getTag(); } // Get the NamedLocation for this item and attach it to the MapView NamedLocation item = getItem(position); holder.mapView.setTag(item); // Ensure the map has been initialised by the on map ready callback in ViewHolder. // If it is not ready yet, it will be initialised with the NamedLocation set as its tag // when the callback is received. if (holder.map != null) { // The map is already ready to be used setMapLocation(holder.map, item); } // Set the text label for this item holder.title.setText(item.name); return row; } /** * Retuns the set of all initialised {@link MapView} objects. * * @return All MapViews that have been initialised programmatically by this adapter */ public HashSet<MapView> getMaps() { return mMaps; } } /** * Displays a {@link LiteListDemoActivity.NamedLocation} on a * {@link com.google.android.gms.maps.GoogleMap}. * Adds a marker and centers the camera on the NamedLocation with the normal map type. */ private static void setMapLocation(GoogleMap map, NamedLocation data) { // Add a marker for this item and set the camera map.moveCamera(CameraUpdateFactory.newLatLngZoom(data.location, 13f)); map.addMarker(new MarkerOptions().position(data.location)); // Set the map type back to normal. map.setMapType(GoogleMap.MAP_TYPE_NORMAL); } /** * Holder for Views used in the {@link LiteListDemoActivity.MapAdapter}. * Once the the <code>map</code> field is set, otherwise it is null. * When the {@link #onMapReady(com.google.android.gms.maps.GoogleMap)} callback is received and * the {@link com.google.android.gms.maps.GoogleMap} is ready, it stored in the {@link #map} * field. The map is then initialised with the NamedLocation that is stored as the tag of the * MapView. This ensures that the map is initialised with the latest data that it should * display. */ class ViewHolder implements OnMapReadyCallback { MapView mapView; TextView title; GoogleMap map; @Override public void onMapReady(GoogleMap googleMap) { MapsInitializer.initialize(getApplicationContext()); map = googleMap; NamedLocation data = (NamedLocation) mapView.getTag(); if (data != null) { setMapLocation(map, data); } } /** * Initialises the MapView by calling its lifecycle methods. */ public void initializeMapView() { if (mapView != null) { // Initialise the MapView mapView.onCreate(null); // Set the map ready callback to receive the GoogleMap object mapView.getMapAsync(this); } } } /** * RecycleListener that completely clears the {@link com.google.android.gms.maps.GoogleMap} * attached to a row in the ListView. * Sets the map type to {@link com.google.android.gms.maps.GoogleMap#MAP_TYPE_NONE} and clears * the map. */ private AbsListView.RecyclerListener mRecycleListener = new AbsListView.RecyclerListener() { @Override public void onMovedToScrapHeap(View view) { ViewHolder holder = (ViewHolder) view.getTag(); if (holder != null && holder.map != null) { // Clear the map and free up resources by changing the map type to none holder.map.clear(); holder.map.setMapType(GoogleMap.MAP_TYPE_NONE); } } }; /** * Location represented by a position ({@link com.google.android.gms.maps.model.LatLng} and a * name ({@link java.lang.String}). */ private static class NamedLocation { public final String name; public final LatLng location; NamedLocation(String name, LatLng location) { this.name = name; this.location = location; } } } 

Código completo disponible en: https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/LiteListDemoActivity.java

Me enfrenté al mismo problema hoy – resulta que usted tiene que crear el MapView dentro de su MapActivity de lo contrario obtendrá un error como Unable to Inflate View com.google.maps.MapView o así … Que pasar este MapView a su ListAdapter Y escupirlo cuando sea necesario. Tuve que colocar el MapView dentro de un RelativeLayout para ajustar la altura y el ancho como quiero (por alguna razón MapView no se comporta el modo de vista "normal" ). Usted puede pedirme detalles si usted tiene gusto 🙂

  • Vista de la lista de android
  • Dar etiquetas de los elementos de la lista de visualización sin el arrayadapter personalizado
  • ListView.getCheckedItemPositions no puede devolver elementos marcados en SparseBooleanArray
  • Listview no actualizar en fragmento con las pestañas viewpager
  • ¿Por qué hay ListVIew en android?
  • Cómo ampliar el elemento de la lista desde el centro de la pizca
  • Android listview semitransparente selección color de una fila
  • Android Checkbox listview seleccionar todo (desactivar / activar)
  • ¿Hay una manera de desactivar el ajuste de línea en una vista de lista en android?
  • Problema de casilla de verificación en la aplicación instalada en listview
  • ¿Cómo puedo reproducir vídeo en ListView como Instagram y Vine?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.