Добавление CheckBox в список строк теряет мои события onItemClick?

У меня есть ListView с адаптером ArrayList. Строки не очень сложны (изображение слева, LinearLayout с TextViews внутри и CheckBox справа), макет копируется ниже.) Цель состоит в том, чтобы создать панель QuickAction, если пользователь нажимает на изображении или тексте, и измените состояние CheckBox, если пользователь нажмет на CheckBox. У меня есть каждая часть, работающая независимо, но не тогда, когда они вместе в макете - так или иначе, я теряю событие onItemClick.

Панель "QuickAction" активируется OnItemClickListener(), и она отлично работает - если у меня нет CheckBox в макете, и в этом случае CheckBox отлично работает (используя onClick()), но onItemClickListener никогда не запускается, если пользователь щелкает в строке, но вне CheckBox. Макет (минус некоторые вещи стиля):

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/vw1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView android:id="@+id/img"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <CheckBox android:id="@+id/ckb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_gravity="right"
    android:checked="false" />

<!-- stack text in middle section of the row -->
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <TextView android:id="@+id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content""/>

        <TextView android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</RelativeLayout>

Код, лежащий за ним, не является сложным:

public class ListGroupsActivity extends BaseActivityForList {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        // add QuickAction bar
        ListView lv = getListView();
        lv.setOnItemClickListener(new QAListener(this));
    }
}

    //inner classes of the ListGroupsActivity
    class CbOnClickListener implements OnClickListener {
        // ...
        // test the checkbox isChecked() and keep state in 'selectedItems' array

    class GroupListAdapter extends ArrayAdapter<Group> {
        super(/*...*/)
    CbOnClickListener cblistener = null; // common listener for all the CheckBoxes

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // here do normal testing for convertView being null etc 
            // heres the view inflation from the layout into the ViewHolder
            holder.tv1 = (TextView) convertView.findViewById(R.id.text1);
            holder.tv2 = (TextView) convertView.findViewById(R.id.text2);
            holder.img = (ImageView) convertView.findViewById(R.id.img);
            holder.ckb = (CheckBox) convertView.findViewById(R.id.ckb);

            Group g = groups.get(position); // this is the data obj for the row

            holder.tv1.setText(g.getName());
            holder.tv2.setText("child groups");
            Bitmap bm = BitmapFactory.decodeFile(g.getIconUri());
            holder.img.setImageBitmap(bm);
            Integer key = (Integer) g.getId();
            holder.ckb.setChecked(selectedItems.contains(key)); 

            holder.ckb.setOnClickListener(cblistener); // hook onClick to cblistener
            return convertView;
    }

QAListener находится в суперклассе для всех моих операций со списком:

public class BaseActivityForList extends
    OrmLiteBaseListActivity<DatabaseHelper> {

    // QAListener inner class, constructs new quick action bar when item clicked
    class QAListener implements OnItemClickListener {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // has three ActionItem instances, 'copyAction', 'delAction', 'editAction'
            ActionItem copyAction = new ActionItem();

            copyAction.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                     // ... does some stuff
                     mQuickAction.dismiss();
                 }
             }); // end setOnClickListener
        } // end onItemClick
    } // end QAListener
} end BaseActivityForList

Итак, как я могу настроить флажок, чтобы забрать onClick, а остальную часть элемента списка выбрать onItemClick()?

Ответ 1

После нескольких часов отладки и исследований. Я заработал установка следующих свойств в флажке:

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

Также возможно, что ImageView может быть настроен, как описано в http://blog.sachin.name/?p=62 (благодаря этому человеку)

На моей стороне я обнаружил, что просмотр элементов НЕ ДОЛЖЕН быть кликабельным, а текстовые представления также не должны быть интерактивными. Мне потребовалось некоторое время, чтобы понять, что я вызывал setClickable (true) в моем представлении элемента где-то в коде.

Ответ 2

Только для дополнения этого принятого ответа: в случае ImageButton вместо CheckBox недостаточно установить в xml focusable и focusableInTouchMode значение false, но во время выполнения фокусной необходимости для значения false. Это означает, что onItemClick будет обнаружен, нужно сделать что-то вроде:

button.setFocusable(false);

поэтому все работает полностью.. Оригинальные кредиты автору здесь. надеюсь, что это поможет кому-то.

Приветствия;)

Изменить: еще более элегантное решение пытается добавить android:descendantFocusability="blocksDescendants" в корневой макет элемента списка. Это сделает клики onListItem возможными, и по отдельности вы можете обрабатывать клики Button или ImageButton