我跟随this tutorial创建了一些不同的东西,本教程展示了叠加如何使用插入到其中的预定义项目,但是如果我想动态添加项目呢?那么我必须从一个空的叠加开始:
而不是:
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,这样我就可以
答案 0 :(得分:2)
据我了解,在ItemOverlay
下,您的意思是ItemizedOverlay
。如果是这样,你就走在了正确的轨道上。 ItemizedOverlay
是地图项的容器,因此每次添加/删除ItemizedOverlay
项时,都需要将最后一个项目设置为-1
,并调用populate()
方法通知mapview关于内容的变化。
请记住,您需要在UI线程上下文中对ItemizedOverlay
内容进行更改;)
这里也有无证件。您需要将最后一个聚焦索引设置为-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