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?
He usado el código en este artículo, y funcionó bien.
http://androidfreakers.blogspot.de/2013/08/display-custom-info-window-with.html
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:
- crear modelo y no poner toda la descarga en
InfoWindowAdapter
- guardar la referencia a Marker (llámalo
markerShowingInfoWindow
)
degetInfoContents(Marker marker)
- 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.