Элемент списка с CheckBox не доступен для кликов

У меня есть элемент списка, который содержит CheckBox, и я хочу, чтобы иметь возможность щелкнуть по CheckBox и самому элементу списка. К сожалению, между ними, похоже, существует какой-то конфликт, поскольку я могу только щелкнуть по элементу, когда комментирую CheckBox. Кажется, я помню, что был способ исправить это, но я не могу найти его в данный момент. Благодаря

EDIT: Это со списком, поэтому нет необходимости вызывать setOnItemClickListener.

ОК, здесь XML для элемента списка. Проблема в том, что CheckBox, но я решил, что может также скопировать все.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_item_survey"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    style="@style/SimpleListItem">
    <TextView
        android:id="@+id/survey_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        style="@style/ListItemTitle" />
    <TextView
        android:id="@+id/survey_date"
        android:layout_below="@id/survey_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/ListItemSubtitle" />
    <TextView
        android:id="@+id/survey_completed"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@id/survey_title"
        android:textColor="@color/accent_1"
        android:text="@string/survey_completed"
        style="@style/ListItemSubtitle" />
    <CheckBox
        android:id="@+id/survey_did_not_attend"
        android:layout_below="@id/survey_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/survey_did_not_attend"
        android:focusable="false"
        style="@style/ListItemSubtitle" />
 </RelativeLayout>

Ответ 1

Как описано здесь и здесь, это либо известная проблема, либо работает так, как было разработано. Если в элементе списка есть элементы с кликабельными или фокусируемыми элементами, сам элемент списка не может быть доступен для кликов. Romain Guy говорит "Это работает как предназначено для поддержки навигации трекбола /dpad ".

Ответ 2

Вам нужно добавить это в свой собственный XML файл адаптера android: descendantFocusability = "blocksDescendants"

Ответ 3

вставьте это в корневой элемент в строке строки xml файла

android:descendantFocusability="blocksDescendants"

Ответ 4

Это сделало для меня работу

<CheckBox
...                
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false" />

Ответ 5

Я решил проблему таким образом. Я реализовал OnClickListener внутри адаптера, а не в Fragment/Activity, и он работает хорошо. Теперь я могу использовать ListView с флажками и нажимать на оба. Вот мой код:

public class MyFragment extends Fragment
{
    ...

    private void setView()
    {
        ListView listView = (ListView) mRootView.findViewById(R.id.listview);
        mItems = DatabaseManager.getManager().getItems();

        // create adapter
        if(listView.getAdapter()==null)
        {
            MyAdapter adapter = new MyAdapter(this, mItems);
            try
            {
                listView.setAdapter(adapter);
            }
            catch(Exception e)
            {
                e.printStackTrace();
                return;
            }
        } 
        else 
        {
            try
            {
                ((MyAdapter) listView.getAdapter()).refill(mItems);
                BaseAdapter adapter = (BaseAdapter) listView.getAdapter();
                listView.requestLayout();
                adapter.notifyDataSetChanged();
            }
            catch(Exception e)
            {
                e.printStackTrace();
                return;
            }
        }

        // handle listview item click
        listView.setClickable(true);
        // listView.setOnItemClickListener(...); // this method does not work in our case, so we can handle that in adapter
    }

    ...
}


public class MyAdapter extends BaseAdapter
{
    ...

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        if (view == null) 
        {
            LayoutInflater inflater = (LayoutInflater) mFragment.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.listview_item, null);
        }

        ...

        // handle listview item click
        // this method works pretty well also with checkboxes
        view.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // do something here
                // for communication with Fragment/Activity, you can use your own listener
            }
        });

        return view;
    }

    ...
}

Ответ 6

Пробовали ли вы настройку

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

?

Это сработало для меня.

Ответ 7

используя   андроид: descendantFocusability = "blocksDescendants" его рабочий тон

Ответ 8

ok.. Создайте экземпляр CheckBox Как

CheckBox check;
check = (CheckBox) myView.findViewById(R.id.check);
check.setOnClickListener(new CheckBoxSelect(position));

введите выше код в onItemClickListener или в Adapter, который вы используете. теперь сделайте класс вроде ниже

private class CheckBoxSelect implements OnClickListener 
    {
        int pos;
        String str;

        public CheckBoxSelect(int position) 
        {
            pos = position;
        }

        public void onClick(View v) 
        {

        }

    }

выполнить любую функцию в onClick.

Ответ 9

Позднее, но тем не менее решение для всех тех, кто все еще нуждается в этом.

Верно, что встроенный механизм с использованием:

final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
    getActivity(),
    android.R.layout.simple_list_item_multiple_choice, lst);

не позволяет обоим, т.е. нажмите на флажок И нажмите на элемент списка. Где бы вы ни нажимали, флажок захватывает событие.

Однако, если вы создаете свой собственный ArrayAdapter с помощью getView, как это, тогда он отлично работает:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_item_ecu_fehler, null);
    }

    v.setFocusable(true);
    v.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
        if (DEBUG)
            Log.i(this.getClass().getSimpleName(),
                " ->>"
                    + Thread.currentThread().getStackTrace()[2]
                        .getMethodName());
        }
    });

            CheckBox selectedForClearingCB = (CheckBox) v
            .findViewById(R.id.checkBox);


        if (selectedForClearingCB != null) {
        selectedForClearingCB.setTag(position); //so we know position in the list       selectedForClearingCB.setChecked(true);
        selectedForClearingCB.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            if (((CheckBox) v).isChecked()) {
                if (DEBUG)
                Log.i(this.getClass().getSimpleName(),
                    " -> CB checked: "
                        + Integer.toString((Integer) v
                            .getTag()));

            }

            }
        });
        }
    }
    return v;
    }

}