Динамическое содержимое в Maps V2 InfoWindow
я хочу показать InfoWindow на маркерах в фрагменте Maps V2. Дело в том, что я хочу показать растровые изображения, которые динамически загружаются из интернета с помощью Универсальный Загрузчик Изображений.
это мой 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;
}
}
у меня есть 2 проблемы с этим:
а то знаю the InfoWindow
рисуется и позже изменяется на него (в моем случае новый BitMap
на ImageView
) не показаны/ с InfoWindow
не будучи усовершенствованный. Как я могу "уведомить" InfoWindow, чтобы перезагрузить себя, когда imageLoader
закончил? Когда я ставлю
marker.showInfoWindow()
на onLoadingComplete
он создал бесконечный цикл, в котором маркер появится, начнет загрузку изображения, всплывает и т. д.
моя вторая проблема заключается в том, что при медленном сетевом подключении (имитируемом с задержкой 5000ms в коде)ImageView
на InfoWindow
всегда будет отображаться последнее загруженное изображение, независимо от того, принадлежит ли это изображение ImageWindow
/ Marker
.
любые предложения о том, как propperly реализовать это?
4 ответов
вы должны делать Marker.showInfoWindow()
на маркере, который в настоящее время показывает информационное окно при получении обновления модели.
Итак, вам нужно сделать 3 вещи:
- создать модель и не поставить все загрузки в
InfoWindowAdapter
- сохранить ссылку на маркер (назовем его
markerShowingInfoWindow
)
отgetInfoContents(Marker marker)
- когда модель уведомляет вас о загрузке полного вызова
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isInfoWindowShown()) {
markerShowingInfoWindow.showInfoWindow();
}
Я сделал что-то подобное. Это все еще давало мне ошибку рецессии
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {
markerShowingInfoWindow.showInfoWindow();
}
поэтому я просто закрыл окно и открыл его снова
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {
markerShowingInfoWindow.hideInfoWindow();
markerShowingInfoWindow.showInfoWindow();
}
для более подробной версии того же ответа вот мой оригинальный soultion ссылке
Я использовал код в этой статье, и он работал хорошо.
http://androidfreakers.blogspot.de/2013/08/display-custom-info-window-with.html
Я также столкнулся с той же ситуацией и решил, используя следующий код.
в моем адаптере я добавил общедоступную переменную
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);
}
}
и добавил MarkerClickListener в моей основной деятельности
----
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);
}