it-roy-ru.com

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

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

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

44
Kleptine

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

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

и затем в вашем Adapter '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;
}
60
jqpubliq

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

Android:focusable="false"

Потому что AbsListView.onTouchEvent проверьте child.hasFocusable()

51
meizilp

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

В getView()

setFocusable(false);
setClickable(false);

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

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

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

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

10
JulianSymes

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

Android:descendantFocusability="blocksDescendants" 

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

6
Kapil Raju

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

  Android:focusable="false"
  Android:focusableInTouchMode="false"

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

5
silentkratos

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

5
humbleCoder

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

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

4
greg7gkb

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

1
Pavel Dudka

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

<TextView ... Android:textIsSelectable="false" />
1
hogi

Подклассы ImageButton и setFocusable="false" в определении макета у меня не работают. Это решило вызов setFocusable(false) в конструкторе подкласса.

0
Lukas Novak

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

0
newb
    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);*/
       }
   });

У этого тоста не работает

0
Jay