14

比較的単純なMapActivityがあり、特定のマップ領域内の「キャンプ」のリストを表示しようとしています。CampOverlayItemと呼ばれるOverlayItemのカスタムサブクラス、CampOverlayItemsを返すCampsOverlayと呼ばれるカスタムItemizedOverlay、そしてもちろんマップにデータを取り込むMapActivityサブクラスを作成しました。

アクティビティで作成した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();
    }

}

ここで何が起こっているのか誰かが知っていますか?私が制御できるものがすべてnull以外であることを確認しようとしました。必要に応じて、さらにコードを提供できます。

4

3 に答える 3

20

populate()どこに電話をかけているのかわかりませんCampsOverlay

これは、オーバーレイアイテムの非同期読み込みを示すサンプルプロジェクトです。問題がなければ、おそらくいくつかのアイデアが得られますpopulate()

于 2010-03-31T16:27:07.087 に答える
3

彼は正しい。オーバーレイを設定するには、populate()を呼び出す必要があります。コンストラクターですべてのオーバーレイアイテムを作成し、populateを呼び出し、createItemでリストからアイテムを返すことができます。

于 2010-03-31T16:31:18.167 に答える
2

「オーバーレイアイテムが表示されない理由を理解する必要があります」

そうしなかった場合Drawableは、マーカーがどのように配置されているかを説明する静的関数を使用する必要があるためです。

CampsOverlayコンストラクターでこれを使用できます。

super(boundCenter(defaultMarker));

これは、あなたの原点がDrawable中心であることを示します。boundCenterBottom()原点がの下部中央であることを示すために使用することもできますDrawable

于 2010-08-23T10:21:35.350 に答える