I solved it. In fact, this post is the answer. But I want to explain how to do this and give more detailed information to solve this problem in my situation.
When InfoWindow is displayed, it is fixed in the layout. This means that InfoWindows are not dynamic, it is just a photograph, a snapshot. Therefore, we need to update InfoWindow after successfully loading the image. We can use the Picasso callback for this.
I changed my codes as shown below:
My new InfoWindowAdapter class:
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; } }
I gave him a set of markers, it contains marker identifiers and a boolean to determine the image for this marker, loaded or not. I check this to choose which Picasso code should run. If I do not, it will be a recursion.
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() {} }
Setting markers (using a snippet to pass the image 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));
sembozdemir
source share