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

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

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

13 ответов

Решение

Вместо 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;
}

Установить свой ImageButtonатрибут:

android:focusable="false"

Так как AbsListView.onTouchEvent проверять child.hasFocusable(),

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

В getView()

setFocusable(false);
setClickable(false);

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

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

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

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

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

android:descendantFocusability="blocksDescendants" 

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

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

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

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

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

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

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

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

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

<TextView ... android:textIsSelectable="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);*/
       }
   });

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

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

Я субкласс ImageButton а также setFocusable="false" в определении макета не работает для меня. Решено призвание setFocusable(false) в конструкторе подкласса.

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

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

Другие вопросы по тегам