Элемент списка с 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;
}
}