Я везде искал решение этой проблемы, но не могу понять, как это реализовать. Мой OnItemClickListener был каким-то образом отключен в моих ListView строках, потому что у меня есть ImageButton в макете строк, который берет на себя фокус. Я обнаружил множество вопросов, но ни один из них ни к чему меня не привел.
Я проверил этот вопрос, но не смог разобраться в нем. Мне просто нужен способ сделать строки интерактивными, чтобы я мог определять, когда нажата строка. Длительное нажатие и фокусировка работают нормально.
Переведено автоматически
Ответ 1
Вместо OnItemClickListener добавьте OnClickListener к каждому из ваших представлений, возвращаемых вашим адаптером. Вам нужно будет использовать setItemsCanFocus настройка вашего списка:
и тогда в вашем адаптереgetView это приведет к появлению строки с возможностью кликабельности. Предполагается, что кнопка находится в расширенном формате xml.
Потому что AbsListView.onTouchEvent проверьте child.hasFocusable().
Ответ 3
Я протестировал следующее решение на 8 и 16 уровнях SDK.
В getView()
setFocusable(false); setClickable(false);
вместо того, чтобы устанавливать для них значение true в адаптере, getView() делает то, что, я думаю, требовал исходный вопрос, и означает, что OnItemClickListener вызывается, при условии, что OnClickListener не установлен в getView().
Я предполагаю, что все, что вы можете сделать в представлении, OnClickListener вы можете сделать так же легко в ListView's OnItemClickListener. (setOnClickListener в представлении неявно устанавливает вид интерактивным, что, по-видимому, предотвращает вызов ListViewсоответствующего OnItemClickListener.)
Поведение соответствует ожидаемому с точки зрения ImageButtonвизуального состояния при нажатии или переносе элемента.
Решение представляет собой небольшую иллюзию, поскольку нажимается именно элемент списка, а не ImageButton сам по себе, поэтому, если кнопка не занимает весь элемент списка, щелчок в другом месте элемента все равно приведет к тому, что состояние кнопки, доступное для рисования, будет отражать щелчок. То же самое для focus . Возможно, это цена, которую стоит заплатить.
Ответ 4
Это определенно сработает. Добавьте это в определение макета.