私はここ数日、次の問題に苦しんでいます。このトピックに関する多くのスレッドを見つけましたが、すべてが少し異なっているか、解決策がありませんでした.
私のプロジェクトでは、カスタムを作成し、ItemizedOverlay
これを私のMapView
. アイテムのリストの最後のアイテムを削除するIndexOutOfBoundsException
と、要求されたインデックスが のサイズに等しいという主張が表示されArrayList
ます。つまり、インデックス 2 サイズ 2 またはインデックス 0 サイズ 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
それでも、通常の でエラーが発生するようです。これには、が空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;
}
}