如何通知当前图层位置变化
How notify current layer for position change
我目前正在使用 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 图层会自动收到有关更改的通知。但实际上什么也没发生。只有重新创建对象,我才能看到图钉。
我通过直接从 mapview 对象访问叠加层来让它工作,不确定为什么,因为我希望 mMapView.getOverlays()
将 reference 保存到 ItemizedIconOverlay及其初始化数组
if(mMapView.getOverlays().size() > 0) {
((ItemizedIconOverlay<OverlayItem>)mMapView.getOverlays().get(0)).removeAllItems();
((ItemizedIconOverlay<OverlayItem>)mMapView.getOverlays().get(0)).addItem(overlayItem);
}
}
添加到列表不起作用,因为 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()。
我目前正在使用 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 图层会自动收到有关更改的通知。但实际上什么也没发生。只有重新创建对象,我才能看到图钉。
我通过直接从 mapview 对象访问叠加层来让它工作,不确定为什么,因为我希望 mMapView.getOverlays()
将 reference 保存到 ItemizedIconOverlay及其初始化数组
if(mMapView.getOverlays().size() > 0) {
((ItemizedIconOverlay<OverlayItem>)mMapView.getOverlays().get(0)).removeAllItems();
((ItemizedIconOverlay<OverlayItem>)mMapView.getOverlays().get(0)).addItem(overlayItem);
}
}
添加到列表不起作用,因为 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()。