2017-08-02 20 views
0

当前层。如何通知了我目前使用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的层会自动通知有关更改。但实际上没有发生。只有通过重新创建对象,我才能看到针。

回答

0

我得到它直接从的MapView对象访问覆盖,不知道到底为什么工作,因为我希望mMapView.getOverlays()将举行参考到ItemizedIconOverlay及其itimized阵列

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

您对引用的假设是正确的。真正的原因是你在ItemizedIconOverlay实例上使用了addItem方法。查看我的回复以了解更多详情。 –

1

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

你可以看到有打电话来填充()在AddItem方法(和与项目操作所有其他方法)。

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()。