Picasso-Bild wird in GoogleMap.InfoWindowAdapter geladen

Ich benutze Google Maps Api und möchte ein Bild in InfoWindow zeigen, wenn du auf einen Marker klickst. Ich habe es implementiert, aber es gibt ein Problem über Picasso. Wenn ich auf eine Markierung klicke, wird infoWindow angezeigt und imageView zeigt Platzhalterbild an. Wenn ich noch einmal auf dieselbe Markierung klicke, lädt Picasso das Bild erfolgreich auf. Ich muss zweimal klicken, es ist so seltsam.

Screenshots zum besseren Verständnis:

Zuerst auf den Marker klicken:

Erstes Klicken

Wenn ich noch einmal klicke:

Klicken Sie erneut

Es gibt meine Codes unten:

InfoWindowAdapter (Picasso hier laden)

mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { return null; } @Override public View getInfoContents(Marker marker) { View myContentsView = getLayoutInflater().inflate(R.layout.map_info_content, null); ImageView imageView = (ImageView) myContentsView.findViewById(R.id.imgView_map_info_content); Picasso.with(MainActivity.this) .load(marker.getSnippet()) .placeholder(R.drawable.ic_placeholder) .into(imageView); return myContentsView; } }); 

Einstellen von Markierungen (mit Snippet, um Bild-URL zu übergeben)

 for (MediaFeedData item : mItemList) { LatLng position = new LatLng(item.getLocation().getLatitude(), item.getLocation().getLongitude()); mMap.addMarker(new MarkerOptions() .snippet(item.getImages().getLowResolution().getImageUrl()) .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_point)) .position(position)); } 

InfoWindow-Layout xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/imgView_map_info_content" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

  • Android Picasso Konfiguriere LruCache Größe
  • Zeigen Sie ein "Loading ..." Bild, während Hintergrund Laden von Bild mit Picasso
  • Wie bekomme ich einen Kontext in einem Recycler-View-Adapter
  • Bilder mit Callback in Picasso holen?
  • Setzen Sie die Hintergrundressource mit Picasso
  • Picasso lädt thumbnails aller Telefonfotos
  • Einfachste Art, Picasso in Benachrichtigung zu verwenden (Symbol)
  • Picasso lädt in falsche Bildansicht bei der Verwendung von View-Halter-Muster
  • 2 Solutions collect form web for “Picasso-Bild wird in GoogleMap.InfoWindowAdapter geladen”

    Ich habe es gelöst. Eigentlich ist dieser Beitrag die Antwort. Aber ich möchte erklären, wie es zu tun und geben Sie mehr Details, um dieses Problem in meiner Situation zu lösen.

    Beim Anzeigen eines InfoWindow wird es vom Layout erfasst. Es bedeutet, dass InfoWindows nicht dynamisch sind, sie sind nur ein Bild, ein Schnappschuss. Deshalb müssen wir das InfoWindow nach dem erfolgreichen Image neu erfrischen. Wir können Picassos Rückruf verwenden, um es zu tun.

    Ich habe meine Codes wie unten geändert:

    Meine neue InfoWindowAdapter Klasse:

     public class MapInfoWindowAdapter implements GoogleMap.InfoWindowAdapter { private final Hashtable<String, Boolean> markerSet; private Context context; private View myContentsView; public MapInfoWindowAdapter(Context context, Hashtable<String, Boolean> markerSet) { this.context = context; this.markerSet = markerSet; } @Override public View getInfoWindow(Marker marker) { return null; } @Override public View getInfoContents(Marker marker) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); myContentsView = inflater.inflate(R.layout.map_info_content, null); ImageView imageView = (ImageView) myContentsView.findViewById(R.id.imgView_map_info_content); boolean isImageLoaded = markerSet.get(marker.getId()); if (isImageLoaded) { Picasso.with(context) .load(marker.getSnippet()) .placeholder(R.drawable.ic_placeholder) .into(imageView); } else { isImageLoaded = true; markerSet.put(marker.getId(), isImageLoaded); Picasso.with(context) .load(marker.getSnippet()) .placeholder(R.drawable.ic_placeholder) .into(imageView, new InfoWindowRefresher(marker)); } return myContentsView; } } 

    Ich habe an ihm einen Marker gesetzt, es hält Marker-IDs und ein Boolescher, um das Bild für diesen Marker zu bestimmen, wird geladen oder nicht. Ich überprüfe dies, um auszuwählen, welcher Picasso-Code laufen soll. Wenn ich das nicht mache, wird es Rekursion sein.

    InfoWindowRefresher:

     public class InfoWindowRefresher implements Callback { private Marker markerToRefresh; public InfoWindowRefresher(Marker markerToRefresh) { this.markerToRefresh = markerToRefresh; } @Override public void onSuccess() { markerToRefresh.showInfoWindow(); } @Override public void onError() {} } 

    Einstellen von Markierungen (mit Snippet, um Bild-URL zu übergeben):

     Hashtable<String, Boolean> markerSet = new Hashtable<>(); for (MediaFeedData item : mItemList) { LatLng position = new LatLng(item.getLocation().getLatitude(), item.getLocation().getLongitude()); MarkerOptions markerOptions = new MarkerOptions() .snippet(item.getImages().getLowResolution().getImageUrl()) .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_point)) .position(position); Marker marker = mMap.addMarker(markerOptions); markerSet.put(marker.getId(), false); } mMap.setInfoWindowAdapter(new MapInfoWindowAdapter(this, markerSet)); 

    Was für mich arbeitet, ist das:

    Innerhalb von getInfoWindow (Marker-Marker):

     Picasso.with(getActivity()) .load(URL) .error(R.drawable.my_loader) .placeholder(R.drawable.my_loader) .into(userPhoto, new MarkerCallback(marker,URL,userPhoto)); 

    Dann eine Klasse erstellen:

     public class MarkerCallback implements Callback { Marker marker=null; String URL; ImageView userPhoto; MarkerCallback(Marker marker, String URL, ImageView userPhoto) { this.marker=marker; this.URL = URL; this.userPhoto = userPhoto; } @Override public void onError() { //Log.e(getClass().getSimpleName(), "Error loading thumbnail!"); } @Override public void onSuccess() { if (marker != null && marker.isInfoWindowShown()) { marker.hideInfoWindow(); Picasso.with(getActivity()) .load(URL) .into(userPhoto); marker.showInfoWindow(); } } 

    }

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.