0

ItemizedOverlay を使用して、マップ上にイベントのポイントを表示しています。私の主な目標は、以前に追加されたイベントを見つけて、itemizedOverlay 全体をクリアせずにそのイベントだけを削除 (または編集) できるようにすることです。そこで、独自の一意の ID をインデックスとして使用して、各イベントを ArrayList に追加することにしました。

これは、イベントを追加するコードです。

myItemizedOverlay itemizedOverlay = new MyItemizedOverlay(drawable, mapView);

OverlayItem overlayItem = new OverlayItem(geoPoint, title, subtext);
itemizedOverlay.addOverlay(overlayItem, event_id);
mapOverlays.add(itemizedOverlay);

これは、myItemizedOverlay クラスの ArrayList とコンストラクタ コードです。

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

public void addOverlay(OverlayItem overlay, int event_id)
{
 // **Original** mOverlays.add(overlay);
    mOverlays.add(event_id, overlay);
    populate();
}

つまり、OverlayItem 'overlay' という項目を ArrayList mOverlays の 'event_id' の位置 (たとえば 4) に追加します。

これにより、次の部分でエラーが発生します。

mOverlays.add(event_id, overlay);

エラー:

05-18 13:17:03.989: E/AndroidRuntime(559): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 4, size is 0

ここで何がうまくいかないのか誰にもわかりませんか?とにかく、これが機能したとしても、後でイベントを削除すると (したがって ArrayList の項目)、他のすべての項目のインデックスがそれに応じてシフトするため、ArrayList を使用してそれを利用できないことを知っていますか? それはそれを台無しにします。

そこで調べてみたところ、代わりに SortedMap を使用する必要があることがわかりました。

private SortedMap<Integer, OverlayItem> mOverlays = new TreeMap<Integer, OverlayItem>();

それで、次のコード行を次のように変更しました。

mOverlays.put(event_id, overlay);

しかし、これにより、理由を理解できないエラーが発生しました(以下の完全なエラーを参照):具体的には、myItemizedOverlayの42行目でエラーが発生しました:

populate();

ItemizedOverlay の 311 行目で、その行にアクセスして内容を確認する方法はわかりませんが、明らかに上記の populate() エラーと関係があります。

そして、私がこれを持っていた418行目で

itemizedOverlay.addOverlay(overlayItem, event_id);

完全なエラー:

05-18 13:15:16.450: E/AndroidRuntime(524): FATAL EXCEPTION: main
05-18 13:15:16.450: E/AndroidRuntime(524): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cylbs.android/com.cylbs.android.Home}: java.lang.NullPointerException
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.os.Looper.loop(Looper.java:130)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-18 13:15:16.450: E/AndroidRuntime(524):  at java.lang.reflect.Method.invokeNative(Native Method)
05-18 13:15:16.450: E/AndroidRuntime(524):  at java.lang.reflect.Method.invoke(Method.java:507)
05-18 13:15:16.450: E/AndroidRuntime(524):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-18 13:15:16.450: E/AndroidRuntime(524):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-18 13:15:16.450: E/AndroidRuntime(524):  at dalvik.system.NativeStart.main(Native Method)
05-18 13:15:16.450: E/AndroidRuntime(524): Caused by: java.lang.NullPointerException
05-18 13:15:16.450: E/AndroidRuntime(524):  at com.google.android.maps.ItemizedOverlay.populate(ItemizedOverlay.java:311)
05-18 13:15:16.450: E/AndroidRuntime(524):  at com.cylbs.android.MyItemizedOverlay.addOverlay(MyItemizedOverlay.java:42)
05-18 13:15:16.450: E/AndroidRuntime(524):  at com.cylbs.android.Home.getEvents(Home.java:418)
05-18 13:15:16.450: E/AndroidRuntime(524):  at com.cylbs.android.Home.onCreate(Home.java:128)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-18 13:15:16.450: E/AndroidRuntime(524):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
4

2 に答える 2

1

What does your createItem method look like?

this should probably be a comment, but I don't have access to comments so I'll delete when I get a response

于 2012-05-21T12:48:02.203 に答える
0

エラー

05-18 13:15:16.450: E/AndroidRuntime(524):  at com.google.android.maps.ItemizedOverlay.populate(ItemizedOverlay.java:311)

関数が をcreateItem(int i)返すために発生しますnull

于 2012-08-20T11:20:33.963 に答える