Adicionando o índice personalizado a ArrayList ou SortedMap ao adicionar o overlayitem a ItemizedOverlay

Estou usando o ItemizedOverlay para exibir pontos de eventos em um mapa. Meu objetivo principal é conseguir encontrar um evento que tenha sido adicionado anteriormente para que eu possa excluir (ou editar) apenas isso sem limpar todo o itemizedOverlay. Então, decidi adicionar cada evento ao ArrayList usando seu próprio ID exclusivo como um índice.

Este é o código onde eu adiciono o evento.

myItemizedOverlay itemizedOverlay = new MyItemizedOverlay(drawable, mapView);

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

Este é o código ArrayList e construtor da classe 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();
}

Então, o que eu acho que estou dizendo é: adicione o item OverlayItem 'overlay' aos mOverlays ArrayList na posição 'event_id' (digamos, 4).

Isso me dá um erro embora na parte:

mOverlays.add(event_id, overlay);

erro:

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

Alguém sabe o que está errado aqui? De qualquer forma, eu sei que, mesmo que isso funcione, não posso utilizá-lo usando ArrayList porque, após a exclusão de um evento mais tarde (portanto, um item em ArrayList), o índice de todos os outros itens mudará de acordo? O que vai estragar tudo.

Então eu olhei para cima e descobri que eu deveria usar SortedMap em vez disso:

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

Então eu fiz, e mudei a seguinte linha de código para isso:

mOverlays.put(event_id, overlay);

Mas isso me deu erros que eu não conseguia entender porque (veja o erro completo abaixo): Especificamente, deu-me erro na linha 42 em myItemizedOverlay:

populate();

na linha 311 de ItemizedOverlay, que eu não sei como acessar e ver o que essa linha inclui, mas obviamente tem algo a ver com o erro populate () logo acima.

e na linha 418 onde eu tive este

itemizedOverlay.addOverlay(overlayItem, event_id);

Erro 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)

questionAnswers(2)

yourAnswerToTheQuestion