2

我的项目使用流行的 LazyAdapter 和 listview 来获取滚动时的远程图像并将它们缓存在 sdcard 上以供以后使用。

在应用程序的另一个“屏幕”中,我正在显示地图片段,我想在 Google 地图视图的 CustomInfoWindow 中显示相关图像。这个想法是在必要时从服务器获取图像,如果之前已经下载了图像(通过触摸标记的列表),那么它从 sdcard 获取它。

要将 ImageLoader 与 ListView 一起使用,请将 imageview 与远程 url(在适配器 getView() 中)一起传递给 ImageLoader,如下所示:

imageLoader.DisplayImage("http://urltomarkerpic.com" + pic
                    + ".jpg", ((ImageView) view.findViewById(R.id.badge)));

我尝试在我的自定义信息窗口类(实现 InfoWindowAdapter)的 render() 方法中使用它,它确实有效,但是图像仅在每个标记的第二次按下时加载,第一次按下仅显示默认 jpg(如指定在 xml 中)。一旦我再次触摸标记,它就会从 sdcard 加载图像(我已经用 logcat 确认了这一点)。

采用这种方法似乎很直观,在查看了 LadyAdapters 代码后,我认为这会起作用。有没有其他人尝试过这样做并让它工作?或者任何人都可以建议在 InfoWindow 中重用 ImageLoader 的替代方法(这将真正节省我的带宽),从而 mapview 和 listview 都可以利用延迟加载机制并将图像下载保持在最低限度

4

2 回答 2

1

我不知道您是否仍然需要答案,但无论如何.. 我遇到了同样的问题,这是因为当您通过适配器初始化时传递给信息窗口的视图不是实际的实时视图,而是渲染的图像它,因此在显示时无法更新其内容。

在我的情况下,和你一样,图像在第二次单击时加载,但最终(有点)通过添加标记单击侦听器并在标记单击事件上调用 showInfoWindow() 方法来解决它:

map.setOnMarkerClickListener(new OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        marker.showInfoWindow();
        return false;
    }
}

这将再次加载 InfoWindow 并在加载后刷新图像,而不关闭它(或者至少速度如此之快以至于看起来不像)。我很确定这不是完美的方法,但是无法使用我找到的任何其他解决方案,并且在尝试了几次之后,它的效果足以满足我的需要。

如果有人知道实现这一目标的更好方法,很高兴听到它。

于 2013-05-30T22:10:46.717 回答
0

您不能直接使用图像加载器库,因为如文档中所述,返回的 View is not live。如果您正在使用的库在下载完成时有回调并且位图可用而不会阻塞,您可以尝试将其与强制再次显示信息窗口集成。

您可以在我的回答中按照以下简单步骤操作:Maps V2 InfoWindow 中的动态内容

于 2013-05-31T10:12:20.060 回答