无法从HashMap

时间:2016-04-30 22:13:06

标签: java android google-maps google-maps-markers

我已经将对象保存到名为Memories的HashMap中,我想拉出一个BitMap和一个Title等,并在点击它时将其设置为Markers InfoWindow。我有InfoWindow显示图像和标题等,但是当我添加另一个标记并创建另一个Memories对象时。两个标记都显示最新数据。

@Override
public void showMemory(final Memory memory) {
    Toast.makeText(getApplicationContext(), "The Minions have saved your Memory!", Toast.LENGTH_SHORT).show();
    mMap.addMarker(new MarkerOptions().title(memory.getTitleMem()).position(memory.getLocationMem()));

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

        @Override
        public View getInfoContents(Marker marker) {
            markers.put(marker.getId(), memory);
            View view = getLayoutInflater().inflate(R.layout.marker_layout, null);

            ImageView markerImage = (ImageView)view.findViewById(R.id.markerImage);
            TextView markerTitle = (TextView)view.findViewById(R.id.markerTitle);
            TextView markerDate = (TextView)view.findViewById(R.id.markerDate);

            if(markers != null && markers.size() > 0){
                markerImage.setImageBitmap(markers.get(marker.getId()).getImageMem());
                markerTitle.setText(markers.get(marker.getId()).getTitleMem());
                markerDate.setText(markers.get(marker.getId()).getFormatedDate());
            }



            return view;
        }
    });

    mMap.moveCamera(CameraUpdateFactory.newLatLng(memory.getLocationMem()));
}

这是我将对象保存到HashMap并显示标记内容的地方。我是否在标记中保存并显示错误的数据?

1 个答案:

答案 0 :(得分:1)

您尝试使用final并不能满足您的需求。

为每个未完成的标记调用InfoWindow适配器。这是您在GoogleMap上配置的内容,而不是在个人Marker上配置的内容。这意味着每个未结getInfoContents()都会调用Marker,这会导致您使用相同的Marker更新每个Memory的数据。

解决此问题:

步骤1:将markers.put(marker.getId(), memory);移出getInfoContents()并直接移至showMemory()。您的addMarker()来电会返回Marker,您可以使用getId()来呼叫setInfoWindowAdapter()

第2步:仅为GoogleMap致电TDateTime