Androidのアプリ開発関連のブログ

ListViewの動的更新処理中にタッチするとアプリが落ちる

制作中のアプリでステータス表示の処理を作ったが、
「ListViewの動的更新処理中にタッチするとアプリが落ちる。」
という現象に遭遇した。

ステータスはListViewに表示で、連続して大量にListViewを更新する。
のだが、logcatになにも表示されないでアプリが落ちる現象が発生した。

logcatになにも表示されないので、Timer使った部分かAsyncTaskLoaderの非同期部分が原因かと思ったが、
何度か再現していると、ステータス更新処理中にスクロールしようとしてListViewを触ると100%落ちることが判明。


回避方法は、今回の場合はListViewはスクロールできなくて良いので、
View.setEnabled(false)
か、
View.setOnTouchListener()
でListViewを触った時に何もしないようにすればいいみたい。
スクロールが必要な場合は面倒だね。
setEnabledの方はタッチ以外に影響あるかもなんで、setOnTouchListenerの方で対処した。


テストはAndroid 4.2のエミュレーターで。

ListViewを縦に並べる

制作中のアプリでちょっとハマったんだが、
ファイル一覧等をLinearLayoutで縦に並べて、ステータス表示も同じLinearLayout中に置こうとした。
ステータス表示はListViewで複数行表示できるようにしてLinearLayout中に必要な高さだけ確保してもらえると思ったのだが、
ListViewの高さが更新されないのか、ステータス領域が表示されなかった。

全体のレイアウトはmain.xmlで、ステータス表示用ListViewの行レイアウトはstatus.xml。
status.xmlはLinearLayoutでListViewの行を包む感じだが、ここでandroid:layout_heightを絶対値で指定しないとListViewの高さが確保できないみたい。
status.xmlのLinearLayoutにandroid:layout_heightを絶対値で指定すると、ListViewを更新すれば必要な高さだけ確保されて表示される。