如何通知当前层的位置变化

时间:2017-08-02 06:53:30

标签: java android dictionary openstreetmap osmdroid

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

根据以下example我尝试通过在每次更改位置时不构造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的指针,我希望我的mapview图层会自动通知有关更改。但事实并非如此。只有通过重新创建对象,我才能看到引脚。

2 个答案:

答案 0 :(得分:1)

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

您可以看到addItem方法中调用populate()(以及使用项目操作的所有其他方法)。

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

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

正确的解决方案是:

  1. 不要继续引用列表,而是要引用ItemizedIconOverlay 实例。
  2. 使用mLocationOverlay.addItem(overlayItem)
  3. 添加新点后,您可能需要调用mapView.invalidate()。

答案 1 :(得分:0)

我通过直接从mapview对象访问叠加层来实现它的工作,不确定为什么要完全正确,因为我希望mMapView.getOverlays()引用保存到ItemizedIconOverlay及其itimized数组< / p>

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