Подтвердить что ты не робот

Не может нажимать на строку listview с помощью кнопки изображения

У меня проблемы со списком. его элементы (строки) имеют кнопку изображения. imagebutton имеет "android: onClick", поэтому это событие onclick работает, но щелчок на строке не работает. если я удаляю кнопку изображения из строки, нажмите на работу строки (listview имеет правильный onclick listner). Как я могу это исправить? Мне нужно событие onclick, когда пользователь нажимает на кнопку изображения и стандартное событие click, когда пользователь выбирает строку (не нажимайте кнопку изображения, а выбираем строку)

мой список:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/restaurants_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:divider="@color/list_devider"
        android:dividerHeight="1dp"
        android:cacheColorHint="@color/list_background" /> 
4b9b3361

Ответ 1

К сожалению,

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

не работает для ImageButton.

Наконец я нашел решение здесь. В вашем макете xml для этих элементов добавьте

android:descendantFocusability="blocksDescendants" 

в корневом представлении.

Он отлично работает для ListView, имеющего ImageButton s. Согласно официальной ссылке blocksDescendants означает, что ViewGroup заблокирует его потомки от получения фокуса.

Ответ 2

Вы можете использовать пользовательский адаптер для своего списка (если вы еще этого не сделали). И там, в методе getView(int position, View inView, ViewGroup parent) адаптера сделать что-то вроде этого:

@Override
public View getView(int position, View inView, ViewGroup parent) {

    View v = inView;
    ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview

    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.list_item, null);
        viewHolder = new ViewHolder();
        viewHolder.image = (ImageView) v.findViewById(R.id.ImageView);
        v.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) v.getTag();
    }

        .....

    viewHolder.image.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            //Click on imageView
        }i
    });

    v.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            //Click on listView row
        }
    });

        .....

    return (v);
}

Смотрите здесь, если вам нужна помощь в создании настраиваемого адаптера.

Ответ 3

Если в строке listView есть любой элемент с кликабером, такой как Button, Image.. и т.д., тогда onItemClick не будет работать. Поэтому вам нужно написать прослушиватель кликов в getView вашего адаптера списка.

Подробнее читайте .

Ответ 4

Задайте эти свойства для своей кнопки:

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

Или вы можете установить его динамически в своем классе адаптера:

        yourButton.setFocusable(false);
    yourButton.setFocusableInTouchMode(false);

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

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

Ответ 5

Если строка содержит несколько элементов, которые можно щелкнуть, onItemClick() не будет работать. Вам нужно будет установить OnClickListener в методе getView(). Храните слушатели в теге "Вид", чтобы их можно было перерабатывать, добавлять методы к вашим слушателям, чтобы они могли быть специализированы для разных строк.

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);

        RowClickListeners listeners = (RowClickListeners) view.getTag();
        if (listeners == null) {
            listeners = new RowClickListeners();
        }

        // Row click listener:
        RowClickListener onClickListener = listeners.rowClickListener;
        if (onClickListener == null) {
            onClickListener = new RowClickListener();
            listeners.rowClickListener = onClickListener;
        }
                    onClickListener.setToPosition(pos);
        view.setOnClickListener(onClickListener);

        // Overflow listener:
        View btn = view.findViewById(R.id.ic_row_btn);
        ButtonListener btnListener = listeners.buttonClickListener;
        if (rowListener == null) {
            btnListener = new ButtonListener(activity);
            listeners.rowClickListener = btnListener;
        }
                    btnListener.setToPosition(pos);
        btnListener.setCollection(collectionId);
        btn.setOnClickListener(btnListener);
    }


    public static class RowClickListeners {
        public RowClickListener rowClickListener;
        public ButtonListener buttonClickListener;
    }

Ответ 6

В моем случае android:descendantFocusability="blocksDescendants" для основного слоя не работает, ни в ListView. Я также пробовал android:focusable="false" android:focusableInTouchMode="false", который я слышал о том, что он работает для кнопок, но у меня был ImageButton, так что это не так.

Но настройка свойств кнопки в файле CS макета выполнена.

var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;

Ответ 7

ни один ответ выше не работал у меня, но комбинация сделала.

Теперь я устанавливаю android:descendantFocusability="blocksDescendants" в ListView и android:focusable="false" android:focusableInTouchMode="false" в ImageButtons в XML И в Java. Я также устанавливаю descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS) в ListView и focusable(false), focusableInTouchMode(false), clickable(true) на ImageButtons.