Maps V2 InfoWindow中的动态内容

时间:2013-03-19 15:12:10

标签: android google-maps infowindow universal-image-loader

我想在Maps V2片段中显示有关标记的InfoWindow。 事实是,我想展示使用Universal Image Downloader从网络动态加载的BitMaps。

这是我的InfoWindowAdapter:

class MyInfoWindowAdapter implements InfoWindowAdapter {

    private final View v;

    MyInfoWindowAdapter() {
        v = getLayoutInflater().inflate(R.layout.infowindow_map,
                null);
    }

    @Override
    public View getInfoContents(Marker marker) {



        Item i = items.get(marker.getId());

        TextView tv1 = (TextView) v.findViewById(R.id.textView1);
        ImageView iv = (ImageView) v.findViewById(R.id.imageView1);
        tv1.setText(i.getTitle());


        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .delayBeforeLoading(5000).build();

        imageLoader.getMemoryCache(); 

        imageLoader.displayImage(i.getThumbnailUrl(), iv, options,
                new ImageLoadingListener() {

                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view,
                            FailReason failReason) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onLoadingComplete(String imageUri,
                            View view, Bitmap loadedImage) {
                        Log.d("MAP", "Image loaded " + imageUri);

                    }

                    @Override
                    public void onLoadingCancelled(String imageUri,
                            View view) {
                        // TODO Auto-generated method stub

                    }
    });

        return v;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        // TODO Auto-generated method stub
        return null;
    }

}

我有两个问题:

我们know绘制了InfoWindow并稍后对其进行了更改(在我的情况下,BitMap上的新ImageView)未显示/ {{1没有更新。 InfoWindow完成后,如何“通知”InfoWindow重新加载?当我把

imageLoader

进入marker.showInfoWindow() 它创建了一个无限循环,标记将弹出,开始加载图像,自动弹出等等。

我的第二个问题是,在慢速网络连接上(模拟代码中的5000毫秒延迟),onLoadingComplete中的ImageView将始终显示最后加载的图像,无论该图像是否属于InfoWindow / ImageWindow

有关如何正确实施此建议的任何建议?

4 个答案:

答案 0 :(得分:30)

当您收到模型更新时,您应该在当前显示信息窗口的标记上执行Marker.showInfoWindow()

所以你需要做三件事:

  1. 创建模型,而不是将所有下载内容放入InfoWindowAdapter
  2. 保存对Marker的引用(称之为markerShowingInfoWindow
    来自getInfoContents(Marker marker)
  3. 当型号通知您下载完成呼叫时
  4. if (markerShowingInfoWindow != null && markerShowingInfoWindow.isInfoWindowShown()) {
        markerShowingInfoWindow.showInfoWindow();
    }
    

答案 1 :(得分:4)

我做了类似的事情。 这仍然给我带来经济衰退错误

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {
    markerShowingInfoWindow.showInfoWindow();
}

所以我所做的只是关闭窗口并再次打开它

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {

    markerShowingInfoWindow.hideInfoWindow();
    markerShowingInfoWindow.showInfoWindow();

}

对于同一答案的更详细版本,这是我最初的灵魂LINK

答案 2 :(得分:0)

我已经使用了本文中的代码,但效果很好。

http://androidfreakers.blogspot.de/2013/08/display-custom-info-window-with.html

答案 3 :(得分:0)

我也面临同样的情况,并使用以下代码解决。

在我的适配器中,我添加了公共变量

public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter {

    public String ShopName="";   

    -------
    -------

     @Override
    public View getInfoWindow(Marker arg0) {

         View v;
         v = mInflater.inflate(R.layout.info_window, null);

         TextView shop= (TextView) v.findViewById(R.id.tv_shop);

         shop.setText(ShopName);


    }
}

并在我的主要活动中添加了MarkerClickListener

----

MarkerInfoWindowAdapter mMarkerInfoWindowAdapter;

----
----

@Override
public void onMapReady(GoogleMap googleMap) {


    mMarkerInfoWindowAdapter = new MarkerInfoWindowAdapter(getApplicationContext());



    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

        @Override
        public boolean onMarkerClick(final Marker arg0) {

            mMarkerInfoWindowAdapter.ShopName= "my dynamic text";

            arg0.showInfoWindow();

            return true;
        }
    }

    mMap.setInfoWindowAdapter(mMarkerInfoWindowAdapter);


}