【问题标题】:Adding custom index to ArrayList or SortedMap when adding overlayitem to ItemizedOverlay将覆盖项添加到 ItemizedOverlay 时向 ArrayList 或 SortedMap 添加自定义索引
【发布时间】:2012-05-18 13:53:00
【问题描述】:

我正在使用 ItemizedOverlay 在地图上显示事件点。我的主要目标是能够找到之前添加的事件,以便我可以删除(或编辑)它而不清除整个 itemizedOverlay。所以我决定将每个事件添加到 ArrayList 中,使用它自己的唯一 ID 作为索引。

这是我添加事件的代码。

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)

【问题讨论】:

    标签: android itemizedoverlay


    【解决方案1】:

    你的createItem 方法是什么样的?

    这应该是一条评论,但我无权访问 cmets,所以我会在收到回复时删除

    【讨论】:

    • 感谢您的回复,但我找到了解决方案 :) 如果有人遇到类似问题,我很乐意提供帮助,但一般来说:我创建了两个并行的 ArrayList(带有对象)和一个 LinkedHashMap(带有对象加上它们的 int 标识符)。当我想删除特定对象时,我首先通过 HashMap 中的 int 标识符找到它,然后从 ArrayList 中删除与该 int id 关联的对象。
    【解决方案2】:

    错误

    05-18 13:15:16.450: E/AndroidRuntime(524):  at com.google.android.maps.ItemizedOverlay.populate(ItemizedOverlay.java:311)
    

    是因为函数createItem(int i)返回null造成的。

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 2020-04-18
      • 2023-03-06
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多