7

Ich bin mit Google Maps Api und möge ein Bild innerhalb Infofenster zeigen, wenn eine Markierung klicken. Ich habe es implementiert, aber es gibt ein Problem mit Picasso. Wenn ich auf einen Marker klicke, wird infoWindow angezeigt und imageView zeigt ein Platzhalterbild an. Wenn ich denselben Marker noch einmal anklicke, lädt Picasso das Bild erfolgreich. Ich muss zweimal klicken, es ist so komisch.Picasso Bild Lade Ausgabe in GoogleMap.InfoWindowAdapter

Screenshots zum besseren Verständnis:

Klicken Sie zuerst auf den Marker:

First Click

Wenn ich noch einmal auf:

Click again

Es ist mein Codes unter:

InfoWindowAdapter (Picasso Laden hier)

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; 
     } 
    }); 

das Setzen von Markern (Snippet mit 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> 
+0

ein ähnliches Problem (Stoff für Twitter - Picasso), keine Lösung http://stackoverflow.com/questions/32715198/fabric-twitter- do-not-download-pictures-of-tweet –

+0

Es geht also nicht um Picasso. InfoWindowAdapter funktioniert nicht richtig – sembozdemir

Antwort

8

Ich löste es. Eigentlich ist dies post die Antwort. Aber ich möchte erklären, wie es geht und weitere Details geben, um dieses Problem in meiner Situation zu lösen.

Wenn ein Infowindow zeigt, wird der Layout erfasst. Es bedeutet, dass InfoWindows nicht dynamisch sind, sie sind nur ein Bild, ein Schnappschuss. Deshalb müssen wir das InfoWindow aktualisieren, nachdem das Bild erfolgreich geladen wurde. Wir können Picassos Callback dazu verwenden.

änderte ich meine Codes wie unten:

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 an sie übergeben ein Marker gesetzt, es hält Marker-IDs und ein boolean Bild für diesen Marker zu bestimmen, ist geladen oder nicht. Ich bin Überprüfung dieses zu wählen, welcher Code Picasso ausgeführt werden 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() {} 
} 

das Setzen von Markern (Snippet mit 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)); 
+0

Es war sehr hilfreich, danke! –

+0

@sembozdemir was ist der Import für die Geräte Callback? – TheQ

+0

@TheQ 'com.squareup.picasso.Callback' – sembozdemir

3

Was für mich arbeitet, ist dies:

Innen getInfoWindow (Markierungsmarker):

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(); 
    } 
} 

}

+0

danke, ich denke, dieser einfachste Weg – wanz

+0

@Guilherme Simão Couto, was ist der Import für diese Callback-Implementierung? – TheQ

+0

@TheQ import com.squareup.picasso.Callback; –