AndroidのViewの中でも頻出かつクセのある ListView関連のTips集Vol.1
症状例
- ListViewの子要素(アイテム)のタッチが効かない
- ListView自体のタッチが効かない
原因
■ イベントを取得したいアイテム以外にonClickListener
などのイベントを取られている
Click系イベントに影響するものは、
- Button関連
- Button
- ImageButton
- CustomなButton
- CheckBox
- CheckBox
- CustomなCheckBox
android:inputType=”textMultiLine”
を含むTextView
などがある。
ListViewのアイテムに上記を入れている場合は注意。
■ 不用意にRootView(※)にandroid:clickable=true
をつけている
RootViewに上記を指定すると、内包するアイテムにも定義付けされ、イベントを取得したいもの以外に上記を定義することに繋がる。
ご利用は計画的に。
解決策
■ 一旦ListViewのアイテムのFocus属性を外す
ListViewのFocus属性を白紙に戻し、イベントを受け取りたいアイテムに属性を再定義して上書きする。
listview_item_sample_01.xml
android:descendantFocusability="blocksDescendants"
を入れることで、下位のViewのfocusを制限し、ListViewに制御を持たせることができる。
■ RootViewの指定を間違えない
前述した基本事項だが、RootViewはアイテムまで指定されるので注意が必要。
以下のように、
listview_sample.xml
android:clickable="true"
を間違えてRootViewで指定すると、各アイテム全てに指定したことになる。
■ イベント取得不要なアイテムからfocus属性を外す
イベント取得が不要なアイテムが少ない場合は、各アイテムに
listview_item_02.xml
android:focusable="false"
android:focusableInTouchMode="false"
を直接指定して、フォーカスを当てないようにすることも可能。
ListView Tips集
- 【ListView Tips Vo.1】ListViewの子要素(アイテム)のClickがおかしくなる 〜主な原因と対処法〜
- 【ListView Tips Vol.2】忙しい人のためのStickyListHeadersListViewの使い方 〜基本編〜
- 【ListView Tips Vol.3】ListViewでアイテムアニメーションしよう! 〜View.startAnimationに関する考察〜
- 【ListView Tips Vol.4-1】ButterKnifeで効率よくIDバインドする 〜findViewByIdもOnClickも、もういらない(仮)〜