【Android】ListView要素にボタンを追加すると要素自体のクリックイベントが呼ばれない

長いタイトルですみません。
Android アプリでカスタム ListView を利用しているとき、List の要素に Button(ImageButton)を追加したところ、要素自体のクリックイベントが呼ばれなくなったので、その対処法について。
実はこれ、以前も経験していて対処法があることは覚えていたのですが、その内容は失念していたので、備忘録としてまとめ。

なお、参考にさせていただいたサイトはこちらから。

ボタン付きのListViewを実装してみる – Qiita
https://qiita.com/maromaro3721/items/6ac3cba4f090662adabf

 

で、対処法ですが、ListViewItem のレイアウトを記述しているXMLファイルに、下記の一行を追加するだけ。

android:descendantFocusability="blocksDescendants"

具体的には下記のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <ImageButton
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:src="@drawable/icon"
        android:scaleType="fitCenter"
        android:id="@+id/btn"
        android:layout_alignParentRight="true"/>
</RelativeLayout>

5行目に記述しています。
これを指定し忘れると、ListViewItem のボタンは反応するのに、ListViewItem 自体がクリックできなくなるのでご注意ください。
ちなみに、それ以外の指定等はなにもなく、これだけです。

なお、ListViewItemに指定したボタンのクリック検知は、ListAdapter の getView関数内で行います。
抜粋するとこんな感じ。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;

    if (convertView != null) {
        view = convertView;
    } else {
        view = mInflater.inflate(mResource, null);
    }

    // ボタンのクリックイベント
    ImageButton btn = view.findViewById(R.id.btn);
    btn.setOnClickListener(view1 -> {
        // ボタンクリック時に行いたいたい処理
     });

     return view;
}

 

以上、カスタムしたListView にボタンを追加した際、ListViewItem自体のクリックイベントが呼ばれなくなる現象とその対処法についてでした。
同じことでお困りの方は、是非お試しください。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG