OnItemCLickListener не работает в listview

Activity код класса:

conversationList = (ListView)findViewById(android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new  ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Log.d("test","clicked");
    }
});

Функция getView в классе Adapter:

if (v == null) {                                
    LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(leftSideMessageNumber.equals(m.getTo())) {
        v = vi.inflate(R.layout.conversation_list_item_format_left, null);
    } else {
        v = vi.inflate(R.layout.conversation_list_item_format_right, null);
    }
}

Есть ли проблема с использованием двух xmls при раздувании?

Ответ 1

Я только что нашел решение отсюда, но с помощью глубокого нажатия.

Если какой-либо элемент строки списка содержит фокусируемое или кликабельное представление, OnItemClickListener не будет работать.

Элемент строки должен иметь следующий параметр: android:descendantFocusability = "blocksDescendants".

Здесь вы можете увидеть пример того, как должен выглядеть ваш элемент списка. Ваш элемент списка xml должен быть... row_item.xml (your_xml_file.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false"
    android:descendantFocusability="blocksDescendants"
    android:gravity="center_vertical" >

    // your other widgets here

</LinearLayout>

Ответ 2

Проблема заключается в том, что ваши макеты содержат либо настраиваемые, либо интерактивные элементы. Если представление содержит либо настраиваемый, либо кликабельный элемент, OnItemCLickListener не будет вызываться.

Нажмите здесь для получения дополнительной информации.

Пожалуйста, разместите один из ваших макетов xmls, если это не так.

Ответ 3

Для моих списков в моих строках есть и другие вещи, которые можно нажимать, например кнопки, поэтому создание общего слоя blocksDescendants не работает. Вместо этого я добавил строку в кнопку xml:

android:focusable="false"

Это удерживает кнопки от блокирования щелчков на строках, но позволяет кнопкам принимать щелчки.

Ответ 4

вам нужно сделать 2 шага в вашем listview_item.xml

  • установите корневую компоновку с помощью: android:descendantFocusability="blocksDescendants"
  • задайте любой фокусный или кликабельный вид в этом элементе с помощью:
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"

Вот пример: listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:gravity="center_vertical"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants">

    <RadioButton
        android:id="@+id/script_name_radio_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:textColor="#000"
        android:padding="5dp"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"
        />

</LinearLayout>

Ответ 5

используйте нижеприведенный код внутри тега кнопки в пользовательской раскладке строк списка

 android:focusable="false"
 android:clickable="false"

Ответ 6

У меня была такая же проблема, и я просто заметил, что случайно установил:

@Override
public boolean isEnabled(int position)
{
    return false;
}

в моем классе CustomListViewAdapter.

Изменив это на:

return true;

Мне удалось решить проблему. На всякий случай, если кто-то совершил ту же ошибку...

Ответ 7

Используйте android: descendantFocusability

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dip"
    android:background="@color/light_green"
    android:descendantFocusability="blocksDescendants" >

Добавить выше в корневом макете

Ответ 8

Я решил это с помощью этого ответа

1. Добавьте в Linear Layout list_items.xml следующее: android:descendantFocusability="blocksDescendants"

2.Создание форм LinearLayout в list_items.xml

 android:focusable="false" 

Ответ 9

если у вас есть текстовые изображения, кнопки или stg кликабельны или доступны только в вашем представлении строк

android:descendantFocusability="blocksDescendants"

недостаточно. Вы должны установить

android:textIsSelectable="false"

к вашим текстам и

android:focusable="false"

к вашим кнопкам и другим настраиваемым элементам.

Ответ 10

Даже у меня была та же проблема, у меня есть флажок, сделал следующее для маскировки itemClickListener,

Добавлены следующие свойства к флажку,

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

и ItemClickListner начал работать.

В качестве подробного примера вы можете перейти по ссылке,

http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/

Надеюсь, это поможет Cheers!

Ответ 11

У меня была такая же проблема, и я попробовал все упомянутые решения безрезультатно. через тестирование я обнаружил, что выбор текста позволяет предотвратить вызов слушателя. Поэтому, переключив его на false или удалив, мой слушатель был вызван снова.

android:textIsSelectable="false"

надеюсь, что это поможет кому-то, кто застрял как я.

Ответ 12

Два удивительных решения: если вы расширяете ListFragment из фрагмента, знаете, что mListView.setOnItemClickListener не будет вызван до создания вашей активности, это обеспечило его настройку, когда была создана активность.

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
            // Do the onItemClick action

            Log.d("ROWSELECT", "" + rowId);
        }
    });
}

Посмотрев исходный код для ListFragment, я наткнулся на это

public class ListFragment extends Fragment {
    ...........................................
    ................................................

    final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            onListItemClick((ListView)parent, v, position, id);
        }
    };

    ................................................................
    ................................................................

    public void onListItemClick(ListView l, View v, int position, long id) {
    }
}

Объект onItemClickListener прикреплен и вызывает onListItemClick() Таким образом, другое подобное решение, которое работает точно так же, - это переопределить onListItemClick()

@Override
public void onListItemClick(ListView l, View v, int position, long rowId) {
    super.onListItemClick(l, v, position, id);
   // Do the onItemClick action

   Log.d("ROWSELECT", "" + rowId);
} 

Ответ 13

в моем случае ни одно из свойств макета xml не помогло.

Я просто добавляю одну строку кода следующим образом: convertView.setClickable(false);

@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null || convertView.getTag() == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
        viewHolder = new ViewHolder(convertView);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    ...
    convertView.setClickable(false);
    return convertView;
}

поэтому в основном он делает то же самое, что настраивать свойства в макете xml, но это единственное, что работает в моем случае.

Это не идеальный выбор времени, но, возможно, это поможет кому-то Счастливое кодирование

Ответ 14

  1. Добавьте это в основной макет

    android:descendantFocusability="blocksDescendants"
    
  2. Напишите этот код в каждую кнопку, Textview, ImageView и т.д., Которые имеют onClick

    android:focusable="false"
    
    android:clickable="false"
    

Надеюсь, он сработает.

Ответ 15

Я пробовал все выше и ничего не работал.

Я решил проблему следующим образом:

Сначала я определяю пользовательскую кнопку с именем ListButton

public class ListButton extends android.widget.Button
{

private ButtonClickedListener clickListener;

public ListButton(Context context)
{
    this(context, null);
}

public ListButton(Context context, AttributeSet attrs)
{
    this(context, attrs, 0);
}

public ListButton(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

public void setClickListener(ButtonClickedListener listener) {
    this.clickListener = listener;
}

@Override
public boolean isInTouchMode() {
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    return false;
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    switch (event.getAction()) 
      {
          case MotionEvent.ACTION_DOWN:
              break;
          case MotionEvent.ACTION_UP:

              eventClicked();

              break;
          case MotionEvent.ACTION_CANCEL:
              break;
          case MotionEvent.ACTION_MOVE:
              break;
          default :

      }
    return true;
}

private void eventClicked() {
    if (this.clickListener!=null) {
        this.clickListener.ButtonClicked();
    }
}

}

XML выглядит так:

<dk.example.views.ListButton
android:id="@+id/cancel_button"
android:layout_width="125dp"
android:layout_height="80dp"
android:text="Cancel"
android:textSize="20sp" 
android:layout_margin="10dp"
android:padding="2dp"
android:background="#000000"
android:textColor="#ffffff"
android:textStyle="bold"  
/>

Затем я определяю свой собственный интерфейс ButtonClicked Listener:

public interface ButtonClickedListener {
    public void ButtonClicked();
}

Затем я использую свой собственный слушатель так же, как если бы это был обычный OnClickListener:

final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);

    cancelButton.setClickListener(new ButtonClickedListener() {

        @Override
        public void ButtonClicked() {
            //Do your own stuff here...
        }

    });

Ответ 16

У меня была та же проблема, я использовал стиль для своих текстов в макете строки, который имел атрибут "фокусируемый". Это сработало после того, как я его убрал.

Ответ 17

Если вы хотите использовать как простой щелчок, так и длинный щелчок по элементам списка, лучший способ реализовать это будет использовать контекстное меню для длительного клика. Избегайте использования setItemLongClickListener, особенно если у вас несколько раскладок строк для вашего списка.

Ответ 18

Столкнувшись с такой же проблемой, пробовал несколько часов. Если вы попробовали все вышеперечисленное, попробуйте изменить layout_width из списка Listview и элемента списка в match_parent из wrap_content.

Ответ 19

Все вышеперечисленное мне не удалось. Тем не менее, я смог решить проблему (после многих часов ударов головой - Google, если вы слушаете, пожалуйста, подумайте о том, чтобы зафиксировать то, что я встречал ниже, в форме ошибок компилятора, если это возможно)

Вам действительно нужно быть осторожным, какие атрибуты Android вы добавляете в свой XML-макет здесь (в этом оригинальном вопросе он называется list_items.xml). Для меня проблема заключалась в том, что я переключился с представления EditText на TextView и оставил атрибут cruft от изменения (в моем случае, inputType). Компилятор не поймал его, и кликабельность просто не удалась, когда я отправился запускать приложение. Дважды проверьте все атрибуты, которые у вас есть в узлах xml макета.

Ответ 20

Android: атрибут autoText также делает AutoView автоактивным.

Ответ 21

private AdapterView.OnItemClickListener onItemClickListener;

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
 .......

final View view = convertView;
convertView.setOnClickListener(new View.OnClickListener() {
    @Override
     public void onClick(View v) {
         if (onItemClickListener != null) {
             onItemClickListener.onItemClick(null, view, position, -1);
         }
      }
 });

return convertView;
}

public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

Затем в своей деятельности используйте adapter.setOnItemClickListener(), прежде чем прикреплять его к списку.

Скопировал из GitHub его работал для меня

Ответ 22

Для меня сработало добавление приведенного ниже кода в каждое подпредставление внутри макета моего файла row.xml:

android:focusable="false"
android:focusableInTouchMode="false"

Итак, в моем случае:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/testingId"
        android:text="Name"
       //other stuff 
        />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/dummyId"
        android:text="icon"
        //other stuff 
        />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/assignmentColor"
       //other stuff 
       />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/testID"
        //other stuff 
        />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:text="TextView"
        //other stuff 
        />

</android.support.constraint.ConstraintLayout>

И это мой вызов setOnItemClickListener в моем подклассе Fragment:

CustomListView = (PullToRefreshListCustomView) layout.findViewById(getListResourceID());
        CustomListView.setAdapter(customAdapter);
        CustomListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("Testing", "onitem click working");
              //  other code
            }

        });

Я получил ответ отсюда !

Ответ 23

Вот что сработало у меня Сайт

Ответ 24

В моем случае мне пришлось удалить следующую строку из Layout

android:clickable="true"