OnItemClickListener не работает с элементом ListView, содержащим кнопку - PullRequest
31 голосов
/ 07 декабря 2011

У меня есть 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 ]

52 голосов
/ 07 декабря 2011

просто добавьте эту строку в представления элементов вместо самого listView

android:focusable="false"

проверьте более подробную информацию об этом из Пользовательский список ListView для Android не может нажимать на элементы

17 голосов
/ 17 октября 2015

Если у вас есть ImageButtons внутри элемента списка, вам нужно добавить:

android:descendantFocusability="blocksDescendants"

к корневому элементу списка [например, к корневому макету].

Затем в каждом ImageButtonв элементе списка нужно добавить:

android:focusableInTouchMode="true"

Это сработало для меня - но я использовал кнопки ImageButtons, а не стандартную кнопку.

13 голосов
/ 04 декабря 2013

Я также столкнулся с той же проблемой, которую пытался установить android:focusable="false" для просмотра списка, но он не работает, затем я добавляю это к элементу просмотра списка ... как и в моем элементе просмотра списка, я использовал кнопку Toggle, которая создавала проблему, Я добавляю android:focusable="false" к кнопке Toggle и просмотр списка на элементе click listener, чтобы начать работу снова

1 голос
/ 28 марта 2016

Добавить следующую строку в ваш список просмотра

android:choiceMode="singleChoice"

или не забудьте установить следующие строки для текстовых полей макета

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
0 голосов
/ 19 июля 2018

Ну, я знаю, что ни одно из вышеперечисленных решений не будет работать. Я пытался изменить атрибуты xml, но они не работают, но я реализовал это по-новому. Вот как:

Создайте интерфейс CheckBoxOnCheckListener с методом onCheckBoxChecked и передайте необходимые параметры, внедрите интерфейс CheckBoxOnCheckListener в свою активность или фрагмент , содержащий ListView .

Затем в вашем адаптере объявите mListener как CheckBoxOnCheckListener и передайте его в качестве параметра конструктору адаптера из fragment/activity, приведите его к CheckBoxOnCheckListener и присвойте mListener.

Следующий набор mListener как itemView.onClick или CheckBox.onCheckCheckedListener и onCheckChanged вызов метода mListener.onCheckBoxChecked.

Вот и все. Это точно сработает, у меня сработало. Код только в личку.

0 голосов
/ 09 октября 2016

Вы можете написать свой OnTouchEvent в элементе списка и отправить нужное touchEvent своему ребенку, кнопка.

0 голосов
/ 27 ноября 2012

У меня также была проблема с кнопкой в ​​моем ListView.К сожалению, просто установка фокуса на false для всех объектов в моем адаптере не работает для меня.

У меня теперь есть обходной путь.

В вашем адаптере создайте OnClickListener для кнопки (или другого кликабельного)объект), если вы еще этого не сделали.В этом OnClickListener вы сами вызываете OnItemClickListener.

public void onClick(View v) {
    mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
}

Это означает, что вам потребуется предоставить вашему адаптеру доступ как к родительскому ListView, так и к OnItemClickListener.

0 голосов
/ 24 августа 2012

Если вы используете ListView в Activity, убедитесь, что вы установили setOnItemClickListener()

myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener
...