【问题标题】:How notify current layer for position change如何通知当前层位置变化
【发布时间】:2017-08-02 06:53:29
【问题描述】:

我目前正在使用 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 图层会自动收到有关更改的通知。但实际上什么也没发生。只有通过重新创建对象,我才能看到图钉。

【问题讨论】:

    标签: java android dictionary openstreetmap osmdroid


    【解决方案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()。

    【讨论】:

      【解决方案2】:

      我通过直接从 mapview 对象访问覆盖来让它工作,不知道究竟为什么,因为我希望 mMapView.getOverlays() 会持有一个 reference 到 ItemizedIconOverlay 及其 itimized 数组

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

      【讨论】:

      • 您对引用的假设是正确的。真正的原因是您在 ItemizedIconOverlay 实例上使用了 addItem 方法。详情请参阅我的回复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多