LoginSignup
6
7

More than 5 years have passed since last update.

KitKat 未満で ListView の addFooter / removerFooter に注意!

Posted at

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
に置いたので、適当にどうぞ。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7