android google-maps infowindow universal-image-loader

android - Contenidos dinámicos en Maps V2 InfoWindow



google-maps universal-image-loader (4)

Quiero mostrar una ventana de información sobre marcadores en un fragmento de Maps V2. La cuestión es que quiero mostrar BitMaps que se cargan dinámicamente desde la web con Universal Image Downloader .

Este es mi InfoWindowAdapter:

class MyInfoWindowAdapter implements InfoWindowAdapter { private final View v; MyInfoWindowAdapter() { v = getLayoutInflater().inflate(R.layout.infowindow_map, null); } @Override public View getInfoContents(Marker marker) { Item i = items.get(marker.getId()); TextView tv1 = (TextView) v.findViewById(R.id.textView1); ImageView iv = (ImageView) v.findViewById(R.id.imageView1); tv1.setText(i.getTitle()); DisplayImageOptions options = new DisplayImageOptions.Builder() .delayBeforeLoading(5000).build(); imageLoader.getMemoryCache(); imageLoader.displayImage(i.getThumbnailUrl(), iv, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { // TODO Auto-generated method stub } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { // TODO Auto-generated method stub } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { Log.d("MAP", "Image loaded " + imageUri); } @Override public void onLoadingCancelled(String imageUri, View view) { // TODO Auto-generated method stub } }); return v; } @Override public View getInfoWindow(Marker marker) { // TODO Auto-generated method stub return null; } }

Tengo 2 problemas con esto:

Como sabemos, InfoWindow se dibuja y luego se modifican (en mi caso, el nuevo BitMap en ImageView ) no se muestran / InfoWindow no se actualiza. ¿Cómo puedo "notificar" a InfoWindow para que se vuelva a cargar cuando el imageLoader haya terminado? Cuando puse

marker.showInfoWindow()

en onLoadingComplete creó un bucle infinito donde aparecerá el marcador, comenzará a cargar la imagen, se abrirá, etc.

Mi segundo problema es que en una conexión de red lenta (simulada con la demora de 5000ms en el código), ImageView en InfoWindow siempre mostrará la última imagen cargada, sin importar si esa imagen pertenece a esa ImageWindow / Marker .

¿Alguna sugerencia sobre cómo implementar adecuadamente esto?



Debería estar haciendo Marker.showInfoWindow() en el marcador que actualmente muestra la ventana de información cuando recibe la actualización del modelo.

Entonces debes hacer 3 cosas:

  1. crear modelo y no poner toda la descarga en InfoWindowAdapter
  2. guardar la referencia a Marker (llámalo markerShowingInfoWindow )
    de getInfoContents(Marker marker)
  3. cuando el modelo le notifique la descarga completa de la llamada

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isInfoWindowShown()) { markerShowingInfoWindow.showInfoWindow(); }


También me enfrenté a la misma situación y lo resolví usando el siguiente código.

En mi adaptador he agregado una variable pública

public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter { public String ShopName=""; ------- ------- @Override public View getInfoWindow(Marker arg0) { View v; v = mInflater.inflate(R.layout.info_window, null); TextView shop= (TextView) v.findViewById(R.id.tv_shop); shop.setText(ShopName); } }

y agregó MarkerClickListener en mi actividad principal

---- MarkerInfoWindowAdapter mMarkerInfoWindowAdapter; ---- ---- @Override public void onMapReady(GoogleMap googleMap) { mMarkerInfoWindowAdapter = new MarkerInfoWindowAdapter(getApplicationContext()); mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(final Marker arg0) { mMarkerInfoWindowAdapter.ShopName= "my dynamic text"; arg0.showInfoWindow(); return true; } } mMap.setInfoWindowAdapter(mMarkerInfoWindowAdapter); }


Hice algo similar. Esto todavía me estaba dando el error de recesión

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) { markerShowingInfoWindow.showInfoWindow(); }

Entonces, lo que hice fue simplemente cerrar la ventana y abrirla de nuevo

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) { markerShowingInfoWindow.hideInfoWindow(); markerShowingInfoWindow.showInfoWindow(); }

para una versión más detallada de la misma respuesta, aquí está mi ENLACE original.