Android将动态数据添加到InfoWindow

时间:2014-08-25 13:58:29

标签: android google-maps google-places-api infowindow

我正在使用Google地图和Google Places API处理应用程序,假设我使用不同的标记填充地图,并且我在

中跟踪这些标记
Map<Marker, Place> places = new HashMap<Marker, Place>();

这是我的地方课程:

    public class Place {
    String placeId;
    String name;

    public Place(String placeId, String name) {
        this.placeId = placeId;
        this.name = name;
    }
}

我希望能够使用基于placeId参数获取的数据动态填充InfoWindow,这是我在InfoWindowAdapter中执行的操作:

map.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);
                TextView placeName = (TextView)v.findViewById(R.id.info_window_place_name);
                Place place = places.get(marker);
                if (place != null) {
                    placeName.setText(place.name);
                    String photoUrl = "http://www.plopcontenido.com/wp/wp-content/themes/PlopTheme/img/logo.png";
                    new DownloadPlacePhoto(v, marker, placeName.toString()).execute(photoUrl);
                }
                return v;
            }
        });

    private class DownloadPlacePhoto extends AsyncTask<String, Void, Bitmap> {
    View v;
    Marker marker;
    String placeName;

    public DownloadPlacePhoto(View v, Marker marker, String placeName) {
        this.v = v;
        this.marker = marker;
        this.placeName = placeName;
    }

    @Override
    protected Bitmap doInBackground(String... urls) {
        Bitmap download;
        try {
            InputStream in = new URL(urls[0]).openStream();
            download = BitmapFactory.decodeStream(in);
            return download;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap download) {
        if (download != null) {
            ImageView placeImage = (ImageView)v.findViewById(R.id.info_window_place_photo);
            placeImage.setImageBitmap(download);
            placeImage.setContentDescription(this.placeName);
            placeImage.setVisibility(View.VISIBLE);
            if (this.marker.isInfoWindowShown()) {
                this.marker.hideInfoWindow();
                this.marker.showInfoWindow();
            }
        }
    }
}

问题是InfoWindow是一个“快照”而不是实时表示(我完全理解为什么)是关联的Asynctask将在另一个线程内运行,因此快照将在没有我获取的数据的情况下被拍摄。

我听说人们谈论观察者模式和其他人谈论“你需要在输入getInfoWindow函数之前存储你的数据,但由于Google Places限制我不能再执行两个请求(一个用于图片)每个标记都有另一个关于特定地点的数据。

关于如何执行此操作的任何想法?

1 个答案:

答案 0 :(得分:0)

this question & answer的要点是,当您拥有所需的所有数据时,可以使用InfoWindow重新显示marker.showInfoWindow(),在此之前,您可以显示已有的数据或某些数据loading ...“ - 文字。 执行此操作时,您必须检查用户是否在此期间取消选择相应的标记或选择了另一个标记。