OnItemClickListener не работает с элементом ListView, содержащим кнопку
Я имею ListView
с обычаем Adapter
который поставляет View
в ListView
в этом случае:
public View getView(int position, View convertView, ViewGroup parent)
{
RelativeLayout.LayoutParams lineParams;
RelativeLayout line=new RelativeLayout(context);
TextView tv=new TextView(context);
tv.setText("Text in postion="+i);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
line.addView(tv, lineParams);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
//checkbox
CheckBox checkBox=new CheckBox(context);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
line.addView(checkBox, lineParams);
return line;
}
И где-то внутри ListView
есть setOnItemClickListener()
, который должен перехватывать события нажатия элемента. Моя проблема в том, что всякий раз, когда я пытаюсь добавить флажок к элементу - я не получаю никаких ответов от моего ListView
, Если я пропущу CheckBox
или любой другой Button
оно работает.
Я действительно застрял с этой проблемой, я пробовал все виды макетов, выравнивание, обертывание и так далее - бесполезно. Похоже CheckBox
вторгается ListView
события щелчка элемента.
Есть идеи как побороть?
8 ответов
Просто добавьте эту строку в представления элементов вместо самого listView
android:focusable="false"
проверить более подробно об этом из пользовательского списка ListView Android не может нажимать на элементы
Если внутри элемента списка есть кнопки ImageButtons, вам необходимо добавить:
android:descendantFocusability="blocksDescendants"
в элемент элемента корневого списка [такой как корневой макет].
Затем внутри каждой кнопки ImageButton в элементе списка необходимо добавить:
android:focusableInTouchMode="true"
Это сработало для меня - но я использовал кнопки ImageButtons, а не стандартную кнопку.
Я также столкнулся с той же проблемой, которую я пытался установить android:focusable="false"
в просмотр списка, но он не работает, тогда я добавляю это к элементу списка.. как в моем элементе списка, я использовал кнопку Toggle, которая создавала проблему, я добавляю android:focusable="false"
чтобы переключить кнопку и просмотр списка на элементе нажмите слушателя, чтобы начать работу снова
Добавьте следующую строку в ваш список
android:choiceMode="singleChoice"
или не забудьте установить следующие строки в текстовые поля вашего макета
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
Вы можете написать свой OnTouchEvent в своем элементе списка и отправить нужное touchEvent вашему дочернему виду, кнопке.
У меня также была проблема с кнопкой в моем ListView. К сожалению, просто установка фокуса на false для всех объектов в моем адаптере не работает для меня.
Теперь у меня есть обходной путь.
В вашем адаптере создайте OnClickListener для кнопки (или другого интерактивного объекта), если вы этого еще не сделали. В этом OnClickListener вы вызываете OnItemClickListener самостоятельно.
public void onClick(View v) {
mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
}
Это означает, что вам нужно предоставить вашему адаптеру доступ как к родительскому ListView, так и к OnItemClickListener.
Ну, я знаю, что ни одно из вышеперечисленных решений не будет работать. Я пытался изменить атрибуты XML, но они не работают, но я реализовал это по-новому. Вот как:
Создать интерфейс CheckBoxOnCheckListener
с методом onCheckBoxChecked
и передать необходимые параметры, реализовать интерфейс CheckBoxOnCheckListener
в вашей деятельности или фрагмент, содержащий listView.
Далее в вашем адаптере объявите mListener
как CheckBoxOnCheckListener
и передать это как параметр конструктору адаптера из fragment/activity
и бросить его CheckBoxOnCheckListener
и назначить mListener
,
Следующий сет mListener
как itemView.onClick
или же CheckBox.onCheckCheckedListener
а также onCheckChanged
вызов метода mListener.onCheckBoxChecked
,
Вот и все. Это точно сработает, у меня сработало. Код только в личку.
Если вы используете ListView
в Activity
, убедитесь, что у вас есть настройки setOnItemClickListener()
myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener