Добавление пользовательского индекса в ArrayList или SortedMap при добавлении элемента наложения в ItemizedOverlay
Я использую ItemizedOverlay для отображения точек событий на карте. Моя главная цель - найти событие, которое было добавлено ранее, чтобы я мог удалить (или отредактировать) только его, не очищая весь itemizedOverlay. Поэтому я решил добавить каждое событие в ArrayList, используя его собственный уникальный идентификатор в качестве индекса.
Это код, где я добавляю событие.
myItemizedOverlay itemizedOverlay = new MyItemizedOverlay(drawable, mapView);
OverlayItem overlayItem = new OverlayItem(geoPoint, title, subtext);
itemizedOverlay.addOverlay(overlayItem, event_id);
mapOverlays.add(itemizedOverlay);
Это ArrayList и код конструктора из класса 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();
}
Поэтому я думаю, что я говорю: добавьте элемент OverlayItem 'overlay & apos; на 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);
Но это дало мне ошибки, которые я не мог понять почему (см. Полную ошибку ниже): В частности, это дало мне ошибку в строке 42 в myItemizedOverlay:
populate();
в строке 311 ItemizedOverlay, к которой я не знаю, как получить доступ и посмотреть, что включает эта строка, но она, очевидно, как-то связана с ошибкой 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)