如何通知当前图层位置更改



我目前正在使用osmdroid来显示当前定位。

基于以下示例,我尝试通过每次更改位置时不构造ItemizedOverlay<OverlayItem>ArrayList<OverlayItem>来稍微优化系统,而是在构造函数中仅构造一次,然后简单地将点添加到我的 ArrayList 变量。

这是它现在的样子:

private void InitializeMarkersOverlay() {
mOverlayItemArrayList = new ArrayList<OverlayItem>();
ItemizedOverlay<OverlayItem> locationOverlay =
new ItemizedIconOverlay<OverlayItem>(this, mOverlayItemArrayList, null);
mMapView.getOverlays().add(locationOverlay);
}

当新位置到达时:

private void AddPointToOverlay(GeoPoint gPt, boolean bShouldClearList) {
OverlayItem overlayItem = new OverlayItem("", "", gPt);
Drawable markerDrawable = ContextCompat.getDrawable(this, R.drawable.pin);
overlayItem.setMarker(markerDrawable);
// first time initializer
if(bShouldClearList) {
mOverlayItemArrayList.clear();
}
mOverlayItemArrayList.add(overlayItem);
}

由于我的mMapView已经有一个指向mOverlayItemArrayList的指针,我希望我的地图视图的图层能够自动收到有关更改的通知。 但实际上什么也没发生。只有通过重新创建对象,我才能看到引脚。

添加到列表中不起作用,因为 ItemizedIconOverlay 需要对添加执行一些操作。您可以检查 ItemizedIconOverlay 的源代码。

你可以看到在addItem方法(以及所有其他与项目一起操作的方法(中调用了填充((。

public boolean addItem(final Item item) {
final boolean result = mItemList.add(item);
populate();
return result;
}

但是 populate(( 是一个实现细节,并被标记为受保护,因此您无法直接调用它。

正确的解决方案是:

  1. 不要保留对列表的引用,而是对逐项图标覆盖的引用 实例。
  2. 使用 mLocationOverlay.addItem(overlayItem(
  3. 添加新点后,您可能需要调用 mapView.invalidate((。

我通过直接从mapview对象访问覆盖层来使其工作,但不确定确切的原因,因为我希望mMapView.getOverlays()能够保留对逐项图标覆盖及其itimized数组的引用

if(mMapView.getOverlays().size() > 0) {
((ItemizedIconOverlay<OverlayItem>)mMapView.getOverlays().get(0)).removeAllItems();
((ItemizedIconOverlay<OverlayItem>)mMapView.getOverlays().get(0)).addItem(overlayItem);
}
}

最新更新