Hinzufügen eines benutzerdefinierten Index zu ArrayList oder SortedMap, wenn Sie ItemizedOverlay ein Überlagerungselement hinzufügen

Ich verwende ItemizedOverlay, um Punkte von Ereignissen auf einer Karte anzuzeigen. Mein Hauptziel ist es, ein Ereignis zu finden, das zuvor hinzugefügt wurde, damit ich es löschen (oder bearbeiten) kann, ohne das gesamte itemizedOverlay zu löschen. Deshalb habe ich beschlossen, jedes Ereignis mit seiner eigenen eindeutigen ID als Index zur ArrayList hinzuzufügen.

Dies ist der Code, in dem ich das Ereignis hinzufüge.

myItemizedOverlay itemizedOverlay = new MyItemizedOverlay(drawable, mapView);

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

Dies ist der ArrayList- und Konstruktorcode aus der myItemizedOverlay-Klasse:

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();
}

Also, was ich denke, ich sage ist: Hinzufügen des Elements OverlayItem 'Overlay' zu ArrayList mOverlays an Position 'event_id' (sagen wir 4).

Das gibt mir aber zum Teil einen Fehler:

mOverlays.add(event_id, overlay);

Error:

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

Weiß jemand, was hier falsch läuft? Wie auch immer, ich weiß, dass ich ArrayList nicht verwenden kann, auch wenn dies funktioniert, da sich beim späteren Löschen eines Ereignisses (also eines Elements in ArrayList) der Index aller anderen Elemente entsprechend verschiebt. Welches wird es vermasseln.

Also habe ich nachgeschlagen und festgestellt, dass ich stattdessen SortedMap verwenden sollte:

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

Das habe ich getan und die folgende Codezeile in diese geändert:

mOverlays.put(event_id, overlay);

Aber das gab mir Fehler, die ich nicht verstehen konnte, warum (siehe vollständigen Fehler unten): Insbesondere gab es mir Fehler in Zeile 42 in myItemizedOverlay:

populate();

in Zeile 311 von ItemizedOverlay, auf die ich nicht zugreifen und sehen kann, was diese Zeile enthält, aber sie hat offensichtlich etwas mit dem oben genannten populate () - Fehler zu tun.

und in Zeile 418, wo ich das hatte

itemizedOverlay.addOverlay(overlayItem, event_id);

Voller Fehler:

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)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage