2010-03-31 47 views
14

我有一個相對簡單的MapActivity,我試圖在給定的地圖區域內顯示 「陣營」列表。我創建了名爲CampOverlayItem的OverlayItem的一個自定義 子類,名爲CampsOverlay的自定義 返回CampOverlayItems,當然還有一個填充地圖的MapActivity子類 。ItemizedOverlay.getIndexToDraw中的NullPointerException

我從我的活動中創建的 使用AsyncTask從數據庫中提取疊加數據。 AsyncTask由連接到MapView的ViewTreeObserver.OnGlobalLayoutListener觸發。

在的AsyncTask的onPostExecute方法,創建我CampsOverlay類的新實例 並將其傳遞從 數據庫(這是在獲取doInBackground)返回營地的列表。然後我打電話:

mapView.getOverlays().add(newOverlay); 

其中newOverlay是我剛創建的CampsOverlay。所有這些代碼 運行沒有錯誤,但在地圖試圖繪製自己,我得到一個 NullPointerException異常與下面的堆棧跟蹤:

java.lang.NullPointerException 
    at 
com.google.android.maps.ItemizedOverlay.getIndexToDraw(ItemizedOverlay.java: 
211) 
    at 
com.google.android.maps.ItemizedOverlay.draw(ItemizedOverlay.java:240) 
    at com.google.android.maps.Overlay.draw(Overlay.java:179) 
    at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java: 
42) 
    at com.google.android.maps.MapView.onDraw(MapView.java:476) 
    at android.view.View.draw(View.java:6274) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1526) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1524) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.View.draw(View.java:6277) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1526) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1524) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1524) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1524) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1524) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.View.draw(View.java:6277) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1526) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256) 
    at android.view.View.draw(View.java:6277) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at com.android.internal.policy.impl.PhoneWindow 
$DecorView.draw(PhoneWindow.java:1883) 
    at android.view.ViewRoot.draw(ViewRoot.java:1332) 
    at android.view.ViewRoot.performTraversals(ViewRoot.java:1097) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1613) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4203) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit 
$MethodAndArgsCaller.run(ZygoteInit.java:791) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
    at dalvik.system.NativeStart.main(Native Method) 

因爲它似乎特別相關,這裏是我的 ItemizedOverlay代碼子類:

public class CampsOverlay extends ItemizedOverlay<CampOverlayItem> { 
    private ArrayList<Camp> camps = null; 

    public CampsOverlay(Drawable defaultMarker, ArrayList<Camp> theCamps) 
{ 
     super(defaultMarker); 
     this.camps = theCamps; 
    } 

    @Override 
    protected CampOverlayItem createItem(int i) { 
     Camp camp = camps.get(i); 
     CampOverlayItem item = new CampOverlayItem(camp); 
     return item; 
    } 

    @Override 
    protected boolean onTap(int index) { 
     // TODO Auto-generated method stub 
     return super.onTap(index); 
    } 

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

} 

有沒有人有任何想法可能發生在這裏?我試圖用 來驗證我控制的所有內容都是非空的。如有必要,我可以 提供更多的代碼。

回答

20

我看不到您在CampsOverlay處撥打populate()的地方。

Here is a sample project顯示重疊項的異步加載 - 也許它會給你一些想法,如果populate()不是問題。

+0

你完全正確,謝謝Mark。在問這個問題之前,你會認爲我會更加看重你的示例代碼。現在,我只需要弄清楚爲什麼覆蓋項目不會出現;) – lyricsboy 2010-03-31 16:48:26

3

他是對的。您必須調用populate()來填充覆蓋圖。您可能希望在構造函數中創建所有覆蓋項目,調用填充,並在createItem中僅從列表中返回項目。

+0

在createItem中創建構造函數中的項而不是一次一個是否有優勢?在閱讀文檔時,ItemizedOverlay會緩存createItem的結果,所以不一定需要掛在我的子類中。 – lyricsboy 2010-03-31 16:50:57

2

「現在我只需要弄清楚爲什麼覆蓋的商品沒有出現」

如果你沒有,那是因爲你必須使用一個靜態函數您Drawable將解釋如何是你的標記定位。

你可以利用這一點,在你的CampsOverlay構造:

super(boundCenter(defaultMarker));

這將表明您Drawable的起源中心。您還可以使用boundCenterBottom()來指示原點是Drawable的底部中心。