7

Używam Google Maps Api i chcę wyświetlać obraz w InfoWindow po kliknięciu markera. Zaimplementowałem to, ale jest problem z Picasso. Kiedy kliknę znacznik, wyświetla się okno InfoWindow, a obraz pokazuje obraz zastępczy. Jeśli raz jeszcze kliknę ten sam znacznik, Picasso ładuje obraz z powodzeniem. Muszę dwa razy kliknąć, to jest takie dziwne.Problem z ładowaniem obrazu Picasso w GoogleMap.InfoWindowAdapter

ekranu dla lepszego zrozumienia:

pierwsze kliknięcie znacznika:

First Click

Kiedy klikam ponownie:

Click again

Jest moje kody poniżej:

InfoWindowAdapter (Picasso załadunku tutaj)

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

markerów Otoczenie (wykorzystujące fragment przekazać URL obrazu)

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 układu 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

Podobny problem (tkaniny do Twittera - Picasso), bez roztworu http://stackoverflow.com/questions/32715198/fabric-twitter- do-not-download-pictures-of-tweet –

+0

Więc nie chodzi o Picassa. InfoWindowAdapter nie działa poprawnie – sembozdemir

Odpowiedz

8

Rozwiązałem to. W rzeczywistości ta odpowiedź to post. Ale chcę wyjaśnić, jak to zrobić i podać więcej szczegółów, aby rozwiązać ten problem w mojej sytuacji.

Po wyświetleniu okna InfoWindow jest przechwytywane z układu. Oznacza to, że InfoWindows nie są dynamiczne, są tylko obrazem, migawką. Dlatego musimy odświeżyć InfoWindow po pomyślnym załadowaniu obrazu. Możemy użyć Callbacku Picassa, aby to zrobić.

zmieniłem moje kody jak poniżej:

Mój nowy InfoWindowAdapter Klasa:

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

minąłem się ona stać się markery, które posiada identyfikatory markerów i logiczną, aby określić obraz dla tego markera jest załadowany lub nie. Sprawdzam to, aby wybrać, który kod Picassa powinien zostać uruchomiony. Jeśli tego nie zrobię, będzie to rekursja.

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

markery Ustawienie (wykorzystujące fragment przekazać obrazu URL):

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

To było bardzo pomocne, dziękuję! –

+0

@sembozdemir jaki jest import wywołania zwrotnego narzędzia? – TheQ

+0

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

3

co działa dla mnie jest to:

Wewnątrz getInfoWindow (Znacznik znacznika):

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

Następnie tworzyć klasy:

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

dziękuję, myślę, że to najprostszy sposób – wanz

+0

@Guilherme Simão Couto jaki jest import dla tej implementacji 'Callback'? – TheQ

+0

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