使用Glide和GoogleMap.InfoWindowAdapter

3
我正在尝试使用Glide将自定义图片加载到Google Maps信息窗口中。我将活动上下文传递给了适配器(请参见我的下面的代码)。但是我既看不到图片也没有错误提示。
我做错了什么?
class GuideMapInfoWindowAdapter implements GoogleMap.InfoWindowAdapter {

    private final View mWindow;
    private final View mContents;
    private HashMap<Marker, MapPoint> mMarkers;
    private Context mContext;

    GuideMapInfoWindowAdapter(Context context, HashMap<Marker, MapPoint> markerMapPointHashMap) {
        mWindow = getLayoutInflater().inflate(R.layout.guide_map_custom_info_window, null);
        mContents = getLayoutInflater().inflate(R.layout.guide_map_custom_info_content, null);
        mMarkers = markerMapPointHashMap;
        mContext = context;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        render(marker, mWindow);
        return mWindow;
    }

    @Override
    public View getInfoContents(Marker marker) {
        render(marker, mContents);
        return mContents;
    }

    private void render(Marker marker, View view) {
        ImageView mImage = (ImageView) view.findViewById(R.id.badge);
        MapPoint mPoint = markers.get(marker);
        String mUrl = UrlBuilder.guidePhoto(mPoint.getGuideId(), mPoint.getPageId(), 100);
        Glide.with(mContext)
                .load(mUrl)
                .centerCrop()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(mImage);

        String title = marker.getTitle();
        TextView titleUi = ((TextView) view.findViewById(R.id.title));
        if (title != null) {
            titleUi.setText(title);
        } else {
            titleUi.setText("");
        }

        String snippet = marker.getSnippet();
        TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
        if (snippet != null) {
            snippetUi.setText(snippet);
        } else {
            snippetUi.setText("");
        }
    }
}
2个回答

0
问题在于,您正在异步下载图像。在 getInfoContents 中返回 mContents 之后,对 imageview 的任何更改都不会反映出来。
我已更新了您的渲染函数,但还未测试。
private void render(Marker marker, View view) {
        ImageView mImage = (ImageView) view.findViewById(R.id.badge);
        MapPoint mPoint = markers.get(marker);
        String mUrl = UrlBuilder.guidePhoto(mPoint.getGuideId(), mPoint.getPageId(), 100);
        Bitmap image = Glide.with(mContext)
                .load(mUrl)
                .asBitmap()
                .into(-1,-1)
                .get();
        mImage.setImageBitmap(image);

        String title = marker.getTitle();
        TextView titleUi = ((TextView) view.findViewById(R.id.title));
        if (title != null) {
            titleUi.setText(title);
        } else {
            titleUi.setText("");
        }

        String snippet = marker.getSnippet();
        TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
        if (snippet != null) {
            snippetUi.setText(snippet);
        } else {
            snippetUi.setText("");
        }
    }

1
异步加载肯定是问题的根源。我用 BitmapFactory 替换了 Glide,现在它可以工作了。无论如何,感谢您的回答,我会回来测试它的。 - JirkaV
1
不幸的是,.into() 只能在后台线程中使用,对于我的情况它不起作用。我找到了一些例子,在这些例子中 render() 方法再次调用自身并刷新视图。但对我来说,最好的解决方案是预加载图像,然后在此情况下同步加载它们作为位图。 - JirkaV

0

我知道这篇文章有点老了,但我找到了一种方法来实现这个。对于我的用例,所有的图片大小都是相同的,所以这对我来说很有效。

使用.override()onResourceReady(),然后重新加载InfoWindow,每次都会加载图片。

Glide
       .with(Context)
       .load(URL)
       .error(R.drawable.XXXXX)
       .override(150,150)
       .placeholder(R.drawable.XXXXX)
       .listener(new RequestListener<Drawable>()
       {
             @Override
             public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) 
             {
                   Log.e("Glide", "Error Loading Image", e);
                   return false; 
             }

             @Override
             public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource)
             {
                   Log.e("Glide", "Image Loaded");
                   if (marker.isInfoWindowShown())
                   {
                         marker.hideInfoWindow();
                         marker.showInfoWindow();
                   }
                   return false;
              }
        })
        .into(Picture);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接