Dodanie indeksu niestandardowego do ArrayList lub SortedMap podczas dodawania overlayitem do ItemizedOverlay

Używam ItemizedOverlay do wyświetlania punktów zdarzeń na mapie. Moim głównym celem jest znalezienie wydarzenia, które zostało dodane wcześniej, dzięki czemu mogę usunąć (lub edytować) tylko to, bez usuwania całego itemizedOverlay. Postanowiłem więc dodać każde zdarzenie do listy ArrayList, używając własnego unikalnego identyfikatora jako indeksu.

To jest kod, w którym dodam wydarzenie.

myItemizedOverlay itemizedOverlay = new MyItemizedOverlay(drawable, mapView);

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

To jest kod ArrayList i konstruktor z klasy myItemizedOverlay:

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

Tak więc myślę, że mówię: dodaj element OverlayItem 'overlay' do ArrayList mOverlays w pozycji 'event_id' (powiedzmy 4).

Daje mi to błąd, chociaż w części:

mOverlays.add(event_id, overlay);

błąd:

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

Czy ktoś wie, co tu się dzieje? W każdym razie wiem, że nawet jeśli to działa, nie mogę go użyć za pomocą ArrayList, ponieważ po usunięciu zdarzenia później (a więc elementu w ArrayList) indeks wszystkich innych elementów zostanie odpowiednio przesunięty? Co zepsuje to.

Sprawdziłem więc i stwierdziłem, że zamiast tego powinienem użyć SortedMap:

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

Tak zrobiłem i zmieniłem następujący wiersz kodu na ten:

mOverlays.put(event_id, overlay);

Ale to dało mi błędy, nie mogłem zrozumieć dlaczego (zobacz pełny błąd poniżej): W szczególności spowodowało to błąd w linii 42 w myItemizedOverlay:

populate();

w linii 311 ItemizedOverlay, której nie wiem, jak uzyskać dostęp i zobaczyć, co zawiera ta linia, ale oczywiście ma to coś wspólnego z błędem populate () powyżej.

i na linii 418, gdzie to miałem

itemizedOverlay.addOverlay(overlayItem, event_id);

Pełny błąd:

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)

questionAnswers(2)

yourAnswerToTheQuestion