長いタイトルですみません。
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自体のクリックイベントが呼ばれなくなる現象とその対処法についてでした。
同じことでお困りの方は、是非お試しください。