I've looked everywhere for a solution to this, but I can't figure out how to implement it. My OnItemClickListener
was disabled somehow on my ListView
rows, because I have an ImageButton
in the row layout, which takes over the focus. There have been numerous questions I've found, but none of them have gotten me anywhere.
I've checked this question, but I couldn't really make heads or tails of it. I just need a way to get the rows clickable so that I can detect when a row is pressed. Long press and focus work fine.
One alternative to setting an
OnClickListener
for every view is to NOT use anImageButton
- use anImageView
instead. TheImageView
can still send events to anOnClickListener
and won't take over the focus.For my version of this problem, the issue was that I had set my
TextView
object toandroid:inputType="textMultiLine"
. When I removed this line the issue of the list not being clickable was gone. Looks like a nasty little bug.Also, I'm still able to use the
android:minLines/android:maxLines
properties with no problem, so it's not a big issue. Just not the solution I expected.Instead of an OnItemClickListener, add an OnClickListener to each of your views returned from your adapter. You'll need to use
setItemsCanFocus
setting up your list:and then in your Adapter's
getView
, this will yield a clickable row. The button is assumed to be in the inflated xml.I've tested the following solution on SDK levels 8 and 16.
In
getView()
rather than setting them true in the Adapter's
getView()
does what I think the original question wanted, and means that anOnItemClickListener
gets called, provided that anOnClickListener
is not set ingetView()
.I'm assuming that anything you can do in an View's
OnClickListener
you can do just as easily in aListView
'sOnItemClickListener
. (setOnClickListener
on a View implicitly sets the view to be clickable, which prevents theListView
's correspondingOnItemClickListener
getting called, apparently.)The behaviour is as one would expect, in terms of the
ImageButton
's visual state when the item is pressed or rolled over.The solution is a slight illusion, in that it is the list item that's being pressed not the
ImageButton
itself, so if the button doesn't occupy whole list item, clicking somewhere else in the item will still make the button's drawable state reflect the click. Same for focus. That might be a price worth paying.The following line solved the issue in my project:
As an alternative solution which worked for me you can try to extend your adapter from
BaseAdapter
(iso implementingListAdapter
interface)