2011-04-19 23 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