gpt4 book ai didi

android - 从自定义 ItemizedOverlay 中删除某些项目时出现 IndexOutOfBoundsException

转载 作者:行者123 更新时间:2023-11-29 15:28:54 24 4
gpt4 key购买 nike

几天来我一直在努力解决以下问题。我发现了很多关于这个主题的话题,但都有点不同或者没有解决方案。

对于我的项目,我创建了一个自定义 ItemizedOverlay 并将其添加到我的 MapView。如果我现在删除项目列表的最后一项,我会得到一个 IndexOutOfBoundsException,声称请求的索引等于 ArrayList 的大小。 IE。 index 2 size 2 或 index 0 size 0。根据其他主题告诉我的内容,我已经尝试了 populate()setLastFocusedIndex(-1) 方法。这些解决了我遇到的其他问题,但没有解决这个问题。从列表中删除其他项目时它工作正常,问题似乎只发生在最后一项。

我得到以下 Logcat 输出:

01-24 16:11:08.091: E/AndroidRuntime(916): Uncaught handler: thread main exiting due to uncaught exception
01-24 16:11:08.101: E/AndroidRuntime(916): java.lang.IndexOutOfBoundsException: Invalid location 0, size is 0
01-24 16:11:08.101: E/AndroidRuntime(916): at java.util.ArrayList.get(ArrayList.java:341)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.google.android.maps.ItemizedOverlay.getItem(ItemizedOverlay.java:419)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:538)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:455)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:346)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.GestureDetector.onTouchEvent(GestureDetector.java:506)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.google.android.maps.MapView.onTouchEvent(MapView.java:628)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.View.dispatchTouchEvent(View.java:3709)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.os.Handler.dispatchMessage(Handler.java:99)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.os.Looper.loop(Looper.java:123)
01-24 16:11:08.101: E/AndroidRuntime(916): at android.app.ActivityThread.main(ActivityThread.java:4363)
01-24 16:11:08.101: E/AndroidRuntime(916): at java.lang.reflect.Method.invokeNative(Native Method)
01-24 16:11:08.101: E/AndroidRuntime(916): at java.lang.reflect.Method.invoke(Method.java:521)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-24 16:11:08.101: E/AndroidRuntime(916): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-24 16:11:08.101: E/AndroidRuntime(916): at dalvik.system.NativeStart.main(Native Method)

令我困扰的是,它似乎是从标准 ItemizedOverlay 调用方法。我没有添加普通的 ItemizedOverlay 并且我没有在我的 itemizedOverlay 中调用 super 方法,除了在构造函数中。错误似乎仍然发生在正常的 ItemizedOverlay 中,因此 ArrayList 为空是有意义的。

我希望有人能给我指出正确的方向,因为我真的觉得被困在这里了。提前致谢!

这是我的代码:

public class GameItemOverlay extends ItemizedOverlay<Item> {

private ArrayList<Item> mOverlays = new ArrayList<Item>();


public GameItemOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
setLastFocusedIndex(-1);
populate();
}

public void itemDataReady(){
mOverlays = GameSession.items;
setLastFocusedIndex(-1);
populate();
}

@Override
protected Item createItem(int i) {
return mOverlays.get(i);
}

@Override
public int size() {
return mOverlays.size();
}

@Override
protected boolean onTap(int i){
GameSession.remove(mOverlays.get(i).getID()); //Removes the item according to it's position

setLastFocusedIndex(-1);
populate();
return true;

}
}

最佳答案

我花了一段时间才弄明白这个问题。我认为这个问题的答案是 ItemizedOverlay 不打算用于管理(添加和删除)OverlayItem秒。您几乎可以只添加 OverlayItem s 至 ItemizedOverlay如果你想改变任何项目,你需要重新创建ItemizedOverlay (效率不高)。要解决此问题,您需要管理 ItemizedOverlay s (只有一个 OverlayItem )在 Overlay 的列表中s 而不是 OverlayItemItemizedOverlay .类似的东西:

public class SomeActivity extends MapActivity {

private SomeMapView mView;

// Rest of the code ...

private void sendRequest(GeoPoint point)
{
List<Overlay> mOverlays = mView.getOverlays();
// Show red marker
OverlayItem item = new OverlayItem(point, "Hello", "world");
MarkerItemizedOverlay itemOverlay = new MarkerItemizedOverlay(drawable, mView);
itemOverlay.addOverlay(item);
mOverlays.add(itemOverlay);
}
}

public class MarkerItemizedOverlay extends ItemizedOverlay<OverlayItem> {

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
MapView mView;

// Rest of the code ...

@Override
protected boolean onTap(int index) {
List<Overlay> mOverlays = mView.getOverlays();
mOverlays.remove(this);
}
}

关于android - 从自定义 ItemizedOverlay 中删除某些项目时出现 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8989393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com