我正在使用ItemizedOverlay在地图上显示事件点。我的主要目标是能够找到之前添加的事件,以便我可以删除(或编辑)它而不清除整个itemizedOverlay。所以我决定使用自己的唯一ID作为索引将每个事件添加到ArrayList。
这是我添加事件的代码。
myItemizedOverlay itemizedOverlay = new MyItemizedOverlay(drawable, mapView);
OverlayItem overlayItem = new OverlayItem(geoPoint, title, subtext);
itemizedOverlay.addOverlay(overlayItem, event_id);
mapOverlays.add(itemizedOverlay);
这是来自myItemizedOverlay类的ArrayList和构造函数代码:
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'添加到位于'event_id'的ArrayList mOverlays(例如,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);
但这给了我错误,我无法理解为什么(见下面的完整错误): 具体来说,它在myItemizedOverlay中的第42行给出了错误:
populate();
在ItemizedOverlay的第311行,我不知道如何访问并查看该行包含的内容,但它显然与上面的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)
答案 0 :(得分:1)
您的createItem
方法是什么样的?
这应该是评论,但我无法访问评论,所以当我收到回复时我会删除
答案 1 :(得分:0)
错误
05-18 13:15:16.450: E/AndroidRuntime(524): at com.google.android.maps.ItemizedOverlay.populate(ItemizedOverlay.java:311)
导致是因为函数createItem(int i)
返回null
。