我目前正在使用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图层。但实际上没有任何反应。只有重新创建对象,我才能看到图钉。

最佳答案

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

您可以看到在addItem方法(以及所有其他处理项目的方法)中有对populate()的调用。

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


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

正确的解决方案是:


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

08-18 08:50