-1

我正在按照本教程创建一些不同的东西,本教程展示了覆盖如何与插入其中的预定义项目一起工作,但是如果我想动态地向其中添加项目怎么办?那么我必须从一个空的覆盖开始:

代替 :

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);

GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);

mapOverlays.add(itemizedoverlay);

就像教程中预期的那样工作,我需要把这个:

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);

它用一个项目省略了覆盖的初始化。

这种方法会导致地图卡住,点击几下后,我的应用由于 null 异常而被踢出。

1.这是预期的行为吗?这对我来说似乎是一个错误......

2.为了达到预期的行为,我该怎么做?(我可以从一个空的覆盖开始并动态添加项目)

至于我想要实现的,不是用和项目启动覆盖而是动态使用addOverlay,这样我可以

4

1 回答 1

2

据我了解,在ItemOverlay你的意思下ItemizedOverlay。如果是这样,你就在正确的轨道上。ItemizedOverlay是地图项的容器,因此每次添加/删除项时,ItemizedOverlay都需要将最后一个焦点项设置为-1并调用populate()方法来通知地图视图内容更改。

请记住,您需要ItemizedOverlay在 UI 线程上下文中更改内容;)

这里还有一个未记录的技巧。即使没有项目,您也需要将最后一个焦点索引设置为-1并执行(因此您需要在初始化阶段执行此操作)populate()

所以你的代码应该是这样的:

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);

setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content


//now try to add new item
GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);
setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content
于 2012-08-16T17:24:29.700 回答