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
Другие вопросы по тегам