2011-04-19 42 views
2

我正在一个Treasure Quest中引导用户度过难关。我有问题 显示地图我的当前位置在那里寻求点也显示Android为MapView添加新的点(不刷新)

我伸出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进行调试(只是测试)监听器完美工作,我的地图视图mOverlays随着我使用DDMS改变位置而增长,但是当我调用mapview.invalidate()时,发生了这种情况

那是刷新mapview的方式吗?

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

在此先感谢

+0

一切看起来都很好。我在updateWithNewLocation中缺少的唯一代码是“mapOverlays = yourMapView.getOverlays();”。或者,也许你在其他地方初始化它。你有例外吗? – Vincent 2011-04-20 15:47:24

回答

6

@pekechis:您更新mapOverLays(添加新等)后,只需拨打

mapView.postInvalidate(); 

这将刷新映射视图。 您的问题也可能是由于不在内部UI线程中调用此引起的,例如像那

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

因为'postInvalidate'在UI线程上运行,所以您不需要从UI线程上的可运行状态调用'postInvalidate'。来自doc:“使用它来使非UI线程中的View失效。” :-) – cgwyllie 2011-10-19 08:43:05

+0

postInvalidate为我工作。我在一个在UI线程上运行的AsyncTask中从onPostExecute()调用它。 – 2011-12-02 17:21:33

+0

该文档严格规定您必须从非UI线程调用它,从UI线程调用螺母也是可行的。 – 2012-03-07 12:16:52