java - 如何通知当前图层位置变化

标签 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 的指针我希望我的 map View 图层能够自动收到有关更改的通知。但实际上什么也没发生。只有通过重新创建对象,我才能看到图钉。

最佳答案

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

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

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

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

正确的解决方案是:

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

关于java - 如何通知当前图层位置变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45453514/

相关文章:

java - 在 Java 中为一个数字生成多个组合列表

java - 使用 Gson 解析带有嵌套数组的 json

android - 从 Fragment 构建单个插入事件的正确方法

java - 为什么我无法定义数组?

java - 应用程序安装失败 安装失败,并显示消息无法完成 session : INSTALL_PARSE FAILED MANIFEST MALFORMED

子类中空重写方法的 Java 替代方案

java - 构建多重映射的正确方法

java - Android HttpClient 发布文件 MultipartEntity

python - 嵌套字典中的多个嵌套字典

swift - 从两个字典中删除非重复键