Google Maps API V2:每个标记的InfoWindow不同

时间:2014-03-17 21:22:08

标签: android json google-maps google-maps-markers infowindow

我已经设法使用存储的标题和坐标为我的数据库中的每个项目放置一个标记。

我现在正在尝试更改每个InfoWindow的内容,以便显示与每个位置相关的信息(标题和片段除外)。

基本上,地图上存储的所有地点都有一个InfoWindow,其中包含相同类型的信息(例如:价格,开放时间,关闭时间等)。我希望为这些字段显示不同的值 - 存储在数据库中的值。

以下是一些相关代码:

onCreate()的一部分:

  

protected void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
    final MapWrapperLayout mapWrapperLayout = (MapWrapperLayout) findViewById(R.id.map_relative_layout);


    map = mapFragment.getMap();
    map.setMyLocationEnabled(true);
    focusMapOnCurrentLocation();

    // 39 - default marker height
    // 20 - offset between the default InfoWindow bottom edge and it's content bottom edge
    mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20));

    this.infoWindow = (ViewGroup) getLayoutInflater().inflate(R.layout.info_window, null);
    this.infoTitle = (TextView) infoWindow.findViewById(R.id.title);

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

        @Override
        public View getInfoContents(Marker marker) {
            infoTitle.setText(marker.getTitle());
            mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
            return infoWindow;
        }
    });

createMarkersFromJson():

void createMarkersFromJson(String json) throws JSONException {
    // De-serialize the JSON string into an array of city objects
    JSONArray jsonArray = new JSONArray(json);
    int length = jsonArray.length();

    for (int i = 0; i < jsonArray.length(); i++) {
        // Create a marker for each city in the JSON data.
        JSONObject jsonObj = jsonArray.getJSONObject(i);

        int id = jsonObj.getInt("id");
        String name = jsonObj.getString("name");
        String address = jsonObj.getString("address");
        String phone_number = jsonObj.getString("phone_number");
        String city = jsonObj.getString("city");
        String latitude = jsonObj.getString("lat");
        String longitude = jsonObj.getString("long");
        String price = jsonObj.getString("price");

        Marker m = map.addMarker(new MarkerOptions()
                .title(name)
                .position(new LatLng(
                        Double.parseDouble(latitude),
                        Double.parseDouble(longitude)
                ))
        );

        // An example of what I am trying to do for all the places on my map: 
        // this.price = (TextView) infoWindow.findViewById(R.id.price);
        // this.price.setText(jsonObj.getString("price"));
    }
}

问题是相同的InfoWindow与所有标记相关联。我正在寻找一种方法来为我的InfoWindow中的每个标签调用setText()。但是,getInfoContents()只接受标记,标记不能存储此类数据。也许我可以使用HashMap?

1 个答案:

答案 0 :(得分:2)

我认为您使用map的想法应该有效。您可以将标记和jsonObjects存储为Map数据结构中的键和值。以下是sydo代码:

map.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
    Map<Marker,JsonObject> data = createMapFromJSON();  

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

    @Override
    public View getInfoContents(Marker marker) {
        JsonObject d = data.get(marker);            
        if(d!=null){
            infoTitle.setText(d.getString("title"));
            //set all data
            otherViewInInfoWindow.setText(d.getString("address"));
            mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
            return infoWindow;
        }
    }
});