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

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

EDIT: это с ListFragment, поэтому нет необходимости вызывать 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> 

Solutions Collecting From Web of "Элемент списка с CheckBox не доступен для кликов"

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

Вставьте это в корневой элемент XML-файла строки строки item

 android:descendantFocusability="blocksDescendants" 

Как описано здесь и здесь , это либо известная проблема, либо работает так, как она была разработана. Если в элементе списка есть элементы с кликабельными или фокусируемыми элементами, сам элемент списка не может быть доступен для кликов. Ромен Гай говорит: «Это работает так, чтобы поддерживать навигацию по трекболу / плану».

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

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

Я решил проблему таким образом. Я реализовал 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; } ... } 

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

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

?

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

С помощью android: descendantFocusability = "blocksDescendants" его рабочий тон

Ok .. Сделайте экземпляр CheckBox Like

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

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

 private class CheckBoxSelect implements OnClickListener { int pos; String str; public CheckBoxSelect(int position) { pos = position; } public void onClick(View v) { } } 

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

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

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

 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; } }