ListView OnItemClickListener не отвечает?

Я искал везде решение для этого, но я не могу понять, как его реализовать. Мой OnItemClickListener был каким-то образом отключен в моих OnItemClickListener ListView , потому что у меня есть ImageButton в макете строк, который берет на себя внимание. Были многочисленные вопросы, которые я нашел, но ни один из них не достал меня нигде.

Я проверил этот вопрос, но на самом деле я не мог сделать головы или хвосты. Мне просто нужен способ, чтобы строки были удобными, чтобы я мог обнаружить, когда строка нажата. Длительное нажатие и фокус работают нормально.

Вместо OnItemClickListener добавьте OnClickListener в каждый из ваших просмотров, возвращаемых с вашего адаптера. Вам нужно будет setItemsCanFocus в свой список:

 ListView list = (ListView) findViewById(R.id.myList); list.setAdapter(new DoubleClickAdapter(this)); list.setItemsCanFocus(true); 

А затем в getView вашего адаптера , это даст getView строку. Предполагается, что кнопка находится в надутом xml.

 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = View.inflate(context, R.layout.cell, null); view.setClickable(true); view.setFocusable(true); view.setBackgroundResource(android.R.drawable.menuitem_background); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new AlertDialog.Builder(context).setTitle("touched").show(); } }); return view; } 

Установите ImageButton :

 android:focusable="false" 

Поскольку AbsListView.onTouchEvent проверяет child.hasFocusable() .

Я тестировал следующее решение на уровнях 8 и 16 SDK.

В getView()

 setFocusable(false); setClickable(false); 

Вместо того, чтобы устанавливать их true в getView() Adapter делает то, что, по моему мнению, требует оригинальный вопрос, и означает, что OnItemClickListener , при условии, что OnClickListener не установлен в getView() .

Я предполагаю, что все, что вы можете сделать в OnClickListener вы можете сделать так же легко в OnItemClickListener . ( setOnClickListener в представлении неявно задает возможность просмотра клика, что предотвращает, по-видимому, OnItemClickListener соответствующего OnItemClickListener ListView ).

Поведение такое же, как и следовало ожидать, с точки ImageButton визуального состояния ImageButton когда элемент нажат или перевернут.

Решение представляет собой небольшую иллюзию, поскольку элемент списка нажимается не на сам ImageButton , поэтому, если кнопка не занимает весь элемент списка, щелчок в другом месте элемента все равно сделает отображаемое состояние кнопки отражением щелчка , То же самое для фокуса. Это может стоить цена.

Это определенно сработает. Добавьте это в определение макета.

 android:descendantFocusability="blocksDescendants" 

Найденное решение здесь

Один из вариантов установки OnClickListener для каждого представления – НЕ использовать ImageButton – вместо этого используйте ImageView . ImageView прежнему может отправлять события в OnClickListener и не будет захватывать фокус.

Лучший способ сделать это:

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

Установите эти свойства для этой Imagebutton и попробуйте. я

Для моей версии этой проблемы проблема заключалась в том, что я настроил объект TextView на android:inputType="textMultiLine" . Когда я удалил эту строку, проблема с недоступным кликом текстом не удалась. Похож на неприятную маленькую ошибку.

Кроме того, я все еще могу использовать свойства android:minLines/android:maxLines без проблем, поэтому это не большая проблема. Просто не решение, которое я ожидал.

Следующая строка решена в моем проекте:

 <TextView ... android:textIsSelectable="false" /> 

В качестве альтернативного решения, которое работало для меня, вы можете попытаться расширить свой адаптер от BaseAdapter ( ListAdapter интерфейс ListAdapter )

Поместите этот код ImageView nextpage= (ImageView)findViewById(R.id.btnEdit); Вместо ImageButton . Теперь элемент списка активен

У меня есть sub- ImageButton и setFocusable="false" в определении макета для меня не работает. Он решил вызвать setFocusable(false) в конструкторе подкласса.

  listView= (ListView) findViewById(R.id.listview_names); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getBaseContext(),"Clicked Button",Toast.LENGTH_LONG).show(); Log.d("h","clicked"); /* Intent intent=new Intent(MainActivity.this,Display_data.class); intent.putExtra("NAME",n); intent.putExtra("AGE",a); startActivity(intent);*/ } }); 

Y этот тост не работает

Использование ScrollView может препятствовать тому, чтобы onItemClickListener получал вход.

Надеюсь, это поможет кому угодно.