【问题标题】:Android Adding new point to a MapView (don't refresh)Android 向 MapView 添加新点(不刷新)
【发布时间】:2011-04-19 11:05:03
【问题描述】:

我正在做一个宝藏任务,它会引导用户完成一条路线。我有问题 在地图上显示我当前的位置,其中也显示了任务点

我扩展了 ItemizedOverlay

public class QuestItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private ArrayList<OverlayItem> mOverlays= new ArrayList<OverlayItem>();

    public QuestItemizedOverlay(Drawable defaultmarker) {
        super(boundCenterBottom(defaultmarker));
        populate();     
    }

    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    public void removeItem(int index) {
        mOverlays.remove(index);
        populate();
    }

    @Override 
    public int size() {
        return mOverlays.size();
    }

}

当我的位置改变时,我得到了监听器:

private final LocationListener locationlistener= new LocationListener() {
        public void onLocationChanged(Location location) {
            Log.i("LOCATION_UPDATED","");
            updateWithNewLocation(location);
            mapview.invalidate();
    }
        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) { }
        public void onStatusChanged(String provider, int sttus, Bundle extras) { }
    };

而updatewithNewlocation方法的代码如下:

private void updateWithNewLocation(Location location) {
      Double curlat=location.getLatitude();
          Double curlong=location.getLongitude();
          GeoPoint point=new GeoPoint((int)(curlong*1E6),(int) (curlat*1E6));
          OverlayItem overlayitem=new OverlayItem(point,"I'm here","This is where you are");
          Drawable marker=this.getResources().getDrawable(R.drawable.eplogo_marker);          
          overlayitem.setMarker(marker);
          itemizedoverlay.addOverlay(overlayitem);
          mapOverlays.clear();
          mapOverlays.add(itemizedoverlay);
}

使用 DDMS 进行调试(只是测试)监听器工作正常,我的 mapview mOverlays 会随着我使用 DDMS 更改位置而增长,但是当我调用 mapview.invalidate() 时没有任何反应

刷新地图视图的方法是什么?

还有一个问题,如果 mapOverlay 有多个 itemizedoverlay,每个 itemizedoverlay 都带有一些标记,会发生什么?

提前致谢

【问题讨论】:

  • 对我来说一切都很好。我在 updateWithNewLocation 中缺少的唯一行代码是“mapOverlays = yourMapView.getOverlays();”。或者也许你在其他地方初始化它。你有例外吗?

标签: android refresh android-mapview itemizedoverlay


【解决方案1】:

@pekechis:更新 mapOverLays(添加新等)后,只需调用

mapView.postInvalidate();

这将刷新地图视图。 您的问题也可能是由于未在 UI 线程中调用它引起的,例如像这样

mActivity.runOnUiThread(new Runnable() {
 public void run() {            
   mapView.postInvalidate();
  }
});

【讨论】:

  • 您不需要从 UI 线程上的可运行对象调用 postInvalidate,因为 postInvalidate 会在 UI 线程上运行。来自文档:“使用它使来自非 UI 线程的视图无效。” :-)
  • postInvalidate 为我工作。我从运行在 UI 线程上的 AsyncTask 中的 onPostExecute() 调用它。
  • 文档严格规定你必须从 NON UI 线程调用它,从 UI 线程调用 nut 也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2022-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多