将CheckBox添加到列表行会丢失我的onItemClick事件?

时间:2011-03-21 05:04:22

标签: android android-widget android-layout

我有一个带有ArrayList适配器的ListView。行不是很复杂(左边的图像,里面有TextViews的LinearLayout,右边是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

那么,我如何安排Checkbox拿起onClick,以及列表项的其余部分来获取onItemClick()?

2 个答案:

答案 0 :(得分:39)

经过几个小时的调试和研究。我得到了它的工作 在复选框上设置以下属性:

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

此外,ImageView可能需要按照http://blog.sachin.name/?p=62(感谢那个人)

中的描述进行配置

在我这边,我发现项目视图不能是可点击的,文本视图也不应该是可点击的。我花了一段时间才意识到我在代码中的某个地方调用了setClickable(true)。

答案 1 :(得分:12)

只是为了补充这个已接受的答案:如果 ImageButton 而不是CheckBox,则在xml focusable和{{1}中设置是不够的} to false但在运行时可以将focusable设置为false。这意味着要确保检测到focusableInTouchMode必须像以下一样:

onItemClick

所以事情完全有效..作者here的原创作品。希望它对某人有所帮助。

干杯;)

编辑:有更优雅的解决方案尝试在列表元素的根布局中添加button.setFocusable(false); 。这将使点击onListItem成为可能,并且你可以单独处理Button或ImageButton点击