Agregar un índice personalizado a ArrayList o SortedMap al agregar overlayitem a ItemizedOverlay

Estoy usando ItemizedOverlay para mostrar puntos de eventos en un mapa. Mi objetivo principal es poder encontrar un evento que se haya agregado anteriormente para poder eliminarlo (o editarlo) sin borrar todo el Overlay detallado. Así que decidí agregar cada evento a ArrayList usando su propia ID única como un índice.

Este es el código donde agrego el evento.

myItemizedOverlay itemizedOverlay = new MyItemizedOverlay(drawable, mapView);

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

Este es el código de constructor y ArrayList de la clase 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();
}

Entonces, lo que creo que estoy diciendo es: agregue el elemento OverlayItem 'overlay' a ArrayList mOverlays en la posición 'event_id' (por ejemplo, 4).

Esto me da un error aunque en la parte:

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

¿Alguien sabe qué está mal aquí? De todos modos, sé que incluso si esto funciona, no puedo utilizarlo utilizando ArrayList porque al eliminar un evento más adelante (por lo tanto, un elemento en ArrayList), ¿el índice de todos los demás elementos cambiará en consecuencia? Lo que lo estropeará.

Así que lo busqué y encontré que debería usar SortedMap en su lugar:

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

Así lo hice, y cambié la siguiente línea de código a esto:

mOverlays.put(event_id, overlay);

Pero esto me dio errores que no podía entender por qué (vea el error completo a continuación): Específicamente, me dio un error en la línea 42 en myItemizedOverlay:

populate();

en la línea 311 de ItemizedOverlay, que no sé cómo acceder y ver qué incluye esa línea, pero obviamente tiene algo que ver con el error de rellenar () justo arriba.

y en la línea 418 donde tuve este

itemizedOverlay.addOverlay(overlayItem, event_id);

Error completo:

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)

Respuestas a la pregunta(2)

Su respuesta a la pregunta