Dynamiczna zawartość w Maps v2 InfoWindow
Chcę pokazać InfoWindow na znacznikach we fragmencie Maps V2. Chodzi o to, że chcę pokazać bitmapy, które są dynamicznie ładowane z sieci za pomocą Universal Image Downloader.
To jest mój 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;
}
}
Mam z tym 2 problemy:
Jak wiemy InfoWindow
jest rysowane i późniejsze zmiany w nim (w moim przypadku Nowy BitMap
na ImageView
) nie są wyświetlane/ InfoWindow
nie jest aktualizowany. Jak mogę "powiadomić" InfoWindow, aby przeładować po zakończeniu imageLoader
? Kiedy wkładam
marker.showInfoWindow()
Do onLoadingComplete
tworzy nieskończoną pętlę, w której pojawi się znacznik, rozpocznie ładowanie obrazu, sam się pojawi itp.
Mój drugi problem polega na tym, że przy wolnym połączeniu sieciowym (symulowanym z opóźnieniem 5000ms w kodzie), ImageView
w InfoWindow
zawsze wyświetli ostatnio załadowany obraz, bez względu na to, czy należy do tego ImageWindow
/ Marker
.
Jakieś sugestie, jak to propperly wdrożyć?
4 answers
Powinieneś wykonywać Marker.showInfoWindow()
na znaczniku, który aktualnie wyświetla okno informacji po otrzymaniu aktualizacji modelu.
Więc musisz zrobić 3 rzeczy:
- stwórz model i nie umieszczaj całego pobrania w
InfoWindowAdapter
- save reference to Marker (call it
markerShowingInfoWindow
)
odgetInfoContents(Marker marker)
- gdy model powiadomi Cię o pobraniu pełnego połączenia
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isInfoWindowShown()) {
markerShowingInfoWindow.showInfoWindow();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 01:01:52
Zrobiłem coś podobnego. To wciąż dawało mi błąd recesji
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {
markerShowingInfoWindow.showInfoWindow();
}
Więc po prostu zamknąłem okno i otworzyłem je ponownie.]}
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {
markerShowingInfoWindow.hideInfoWindow();
markerShowingInfoWindow.showInfoWindow();
}
Dla bardziej szczegółowej wersji tej samej odpowiedzi oto moja oryginalna soultion LINK
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:21
Użyłem kodu w tym artykule, i to działa dobrze.
Http://androidfreakers.blogspot.de/2013/08/display-custom-info-window-with.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 18:36:32
Byłem również w tej samej sytuacji i rozwiązany za pomocą poniższego kodu.
W moim adapterze dodałem zmienną publiczną
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);
}
}
I dodał MarkerClickListener w mojej głównej działalności
----
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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 07:13:46