7

Sto utilizzando Google Maps Api e voglio mostrare un'immagine all'interno di InfoWindow quando clicco su un Marker. L'ho implementato ma c'è un problema su Picasso. Quando clicco su un marker, viene visualizzata infoWindow e imageView mostra l'immagine segnaposto. Se faccio clic sullo stesso indicatore ancora una volta, Picasso carica l'immagine con successo. Devo cliccare due volte, è così strano.Problema di caricamento dell'immagine Picasso in GoogleMap.InfoWindowAdapter

Screenshots per una migliore comprensione:

Primo scatto sul marcatore:

First Click

Quando clicco ancora:

Click again

c'è la mia codici seguenti:

InfoWindowAdapter (Picasso carico qui)

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

marcatori Impostazione (utilizzando frammento di far passare un'immagine url)

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 di 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

un problema simile (Tessuto a Twitter - Picasso), nessuna soluzione http://stackoverflow.com/questions/32715198/fabric-twitter- do-not-download-pictures-of-tweet –

+0

Quindi non si tratta di Picasso. InfoWindowAdapter non funziona correttamente – sembozdemir

risposta

8

Ho risolto. In realtà, questo post è la risposta. Ma voglio spiegare come farlo e dare maggiori dettagli per risolvere questo problema nella mia situazione.

Quando si visualizza una finestra di informazioni, questa viene catturata dal layout. Significa che InfoWindows non sono dinamici, sono solo un'immagine, un'istantanea. Ecco perché dobbiamo aggiornare InfoWindow dopo che l'immagine è stata caricata correttamente. Possiamo usare il callback di Picasso per farlo.

ho cambiato i codici come di seguito:

La mia nuova Classe InfoWindowAdapter:

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

ho passato ad esso un marker impostati, che detiene ids marcatori e un valore booleano per determinare di immagini per quel marcatore è caricato o no. Lo sto verificando per selezionare quale codice Picasso deve essere eseguito. Se non lo faccio, sarà ricorsione.

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

marcatori Impostazione (utilizzando frammento di passare immagine 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

È stato molto utile, grazie! –

+0

@sembozdemir whats l'importazione per il callback implements? – TheQ

+0

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

3

cosa sta lavorando per me è questo:

All'interno 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)); 

Quindi creare una classe:

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

grazie, penso che questo sia il modo più semplice – wanz

+0

@Guilherme Simão Couto qual è l'importazione per l'implementazione di 'Callback'? – TheQ

+0

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

Problemi correlati