ItemizedOverlayのArrayIndexOutOfBoundsExceptionの対応方法

    どうも、伊藤です。

    前回のMapviewのレイアウト崩れに引き続き、今回も地図系アプリ実装時のトピックスを書きます。

    今回の問題はItemizedOverlay利用時にArrayIndexOutOfBoundsExceptionが発生する問題についての対策です。
    ItemizedOverlayを利用して地図上に複数のピンオブジェクトを表示することがあると思いますが、これをCreate時に一度だけ描画するのではなく、ページ表示後に書き換えた場合に発生する問題です。(実際は書き換え後、同じピンをタップしたタイミング)

    java.lang.ArrayIndexOutOfBoundsException
    ERROR/AndroidRuntime(xxxx):     at com.google.android.maps.ItemizedOverlay.maskHelper(ItemizedOverlay.java:xxx)
    ERROR/AndroidRuntime(xxxx):     at com.google.android.maps.ItemizedOverlay.setFocus(ItemizedOverlay.java:xxx)
    ERROR/AndroidRuntime(xxxx):     at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:xxx)
    ...
    

    ArrayIndexOutOfBoundsExceptionは配列として確保した領域外にアクセスした場合に発生する不具合です。
    ピンオブジェクトのリストに配列を利用していたため、配列の利用方法を変えたり初期化しまくったりと色々試行錯誤すること数時間・・・解決できません!
    Exceptionをトラッキングしまくりデバッグコードを深い階層まで調べてもどうにもこうにも、、、
    もうリストの書き直しはやめようかな・・・と途方に暮れていた時に以下のサイトを見つけました!

    http://developmentality.wordpress.com/2009/10/19/android-itemizedoverlay-arrayindexoutofboundsexception-nullpointerexception-workarounds/

    上記サイトにも書かれているように直観的ではなく腑に落ちない回避策ではありますがpopulate()の前に以下を呼び出せば解決されるようです。

    setLastFocusedIndex(-1); 
    

    なぜ上記を呼ぶことで解決されるのかは理解できていませんが、ここでも書かれているように奇妙ですが気にせず追記して前進しましょう!

    ではでは。