ListView OnItemClickListener не отвечает? - PullRequest
44 голосов
/ 03 марта 2010

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

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

Ответы [ 13 ]

60 голосов
/ 03 марта 2010

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

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

, а затем в вашем Адаптере 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;
}
51 голосов
/ 23 декабря 2010

установите атрибут ImageButton:

android:focusable="false"

Потому что AbsListView.onTouchEvent check child.hasFocusable().

10 голосов
/ 20 сентября 2012

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

В getView()

setFocusable(false);
setClickable(false);

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

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

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

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

7 голосов
/ 11 октября 2013

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

android:descendantFocusability="blocksDescendants" 

Нашел решение здесь

5 голосов
/ 07 апреля 2013

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

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

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

5 голосов
/ 15 сентября 2010

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

4 голосов
/ 11 июня 2010

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

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

1 голос
/ 04 декабря 2015

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

<TextView ... android:textIsSelectable="false" />
1 голос
/ 14 февраля 2012

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

0 голосов
/ 12 июля 2017
    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);*/
       }
   });

Т тост не работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...