Android 4.1.2 でフッターが表示されなかったり、非表示にするときクラッシュすることがあります。
クラッシュする場合のスタックトーレスは以下
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.ClassCastException: android.widget.ArrayAdapter cannot be cast to android.widget.HeaderViewListAdapter
E/AndroidRuntime: at android.widget.ListView.removeFooterView(ListView.java:390)
E/AndroidRuntime: at jp.tokushima.tatsuhama.listviewfooter.MainActivity$1.run(MainActivity.java:29)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:615)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4872)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
原因は、addFooterView
, setAdapter
の順番にあるそう。
http://developer.android.com/intl/ja/reference/android/widget/ListView.html#addFooterView%28android.view.View%29
ちゃんと書いてますね。。。
KitKat 以上の端末で問題なく動くのが怖い。
KitKat 未満もサポートしてるのに、普段 KitKat 以上の端末でしか動作確認していない場合は要注意!
ダメな例
setAdapter(...);
addFooterView(...);
良い例
addFooterView(...);
setAdapter(...);
ちなみに、Footer じゃなくても Header でも同様とのこと。
サンプルプロジェクトを
https://github.com/tatsuhama/ListViewFooterCrash
に置いたので、適当にどうぞ。