使用通用图像加载器在InfoWindow中动态更新Android GoogleMap 2的信息和ImageView。

10

我正在开发新的Google地图v2 API。

我使用了ImageLoader来动态显示标记上的图片。

但问题是,当我在Universal Image Loader的onLoadingComplete()中,ImageView既不会自动无效化,也不会手动无效化。

下次如果我点击相同的标记,图片将从Universal Image Loader的缓存中显示。

以下是我的CustomInfoWindowAdapter代码:

private class CustomInfoWindowAdapter implements InfoWindowAdapter {

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        final View mWindow = getLayoutInflater().inflate(R.layout.custom_info_window, null);

        render(marker, mWindow);
        return mWindow;
    }

    private void render(final Marker marker, View view) {

        final String url = markers.get(marker.getId()).getStrProfilePic();
        final ImageView image = ((ImageView) view.findViewById(R.id.badge));
        Log.e(TAG, "URL : " + url);

        if ( url != null && !url.equalsIgnoreCase("null")
                && !url.equalsIgnoreCase("")) {
            imageLoader.displayImage(url, image, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view,
                        Bitmap loadedImage) {
                    super.onLoadingComplete(imageUri, view, loadedImage);
                    ((ImageView) view).invalidate();
                }
            });
        } else {
            image.setImageResource(R.drawable.noimage);
        }

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

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

当我添加标记时,我会将标记 ID 存储在哈希表中。通过这些 ID,我可以获取照片的 URL。


显示选项?配置?您是否在UI线程上调用displayImage(...) - nostra13
在 render(final Marker marker, View view) 方法中,我调用了 imageLoader.displayImage(...) 方法。 - Nishant Shah
2个回答

10

我在类级别上使用了一个Marker对象,并使用该对象更新Marker的信息。

我已经根据以下代码自定义了我的类以更新ImageView:

private class CustomInfoWindowAdapter implements InfoWindowAdapter {

    private View view;

    public CustomInfoWindowAdapter() {
        view = getLayoutInflater().inflate(R.layout.custom_info_window, null);          
    }

    @Override
    public View getInfoContents(Marker marker) {

        if ( YourClassName.this.marker != null &&
                ClassName.this.marker.isInfoWindowShown() ) {
            YourClassName.this.marker.hideInfoWindow();
            YourClassName.this.marker.showInfoWindow();
        }
        return null;
    }

    @Override
    public View getInfoWindow(final Marker marker) {
        YourClassName.this.marker = marker;

        final String url = markers.get(marker.getId()).getStrProfilePic();
        final ImageView image = ((ImageView) view.findViewById(R.id.badge));

        if ( url != null && !url.equalsIgnoreCase("null")
                && !url.equalsIgnoreCase("")) {
            imageLoader.displayImage(url, image, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view,
                        Bitmap loadedImage) {
                    super.onLoadingComplete(imageUri, view, loadedImage);
                    getInfoContents(marker);
                }
            });
        } else {
            image.setImageResource(R.drawable.noimage);
        }

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

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

        return view;
    }
}

查看示例


在我的应用程序中,我不需要显示多个地图。但是在Map2中,可以显示多个地图。在Android SDK和Google Play服务中提供了演示。 - Nishant Shah
1
@NishantShah 感谢你的回答,但是如果你在评论中发布你的博客网址,那么整个示例将更容易 :) http://androidfreakers.blogspot.in/ 谢谢 :) - Bhavin Chauhan
太厉害了!这是唯一一个对我有效的刷新信息窗口的方法 :D - Matan Dahan

3

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