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

我有一个带有ArrayList适配器的ListView。 行不是很复杂(左边的图像,里面有TextViews的LinearLayout,右边是CheckBox ……下面复制了布局。)目标是如果用户点击则会出现一个QuickAction栏在图像或文本上,如果用户单击CheckBox,则具有CheckBox更改状态。 我让每个部分独立工作,但不是当它们在布局中一起工作时 – 不知何故,我正在失去onItemClick事件。

“QuickAction”栏由OnItemClickListener()激活,它工作正常 – 除非我在布局中有CheckBox,在这种情况下CheckBox工作正常(使用onClick())但如果用户点击,onItemClickListener永远不会被触发行但在CheckBox之外。 布局(减去一些风格的东西)是:

         

它背后的代码并不复杂:

 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 { 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 { // 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()?

经过几个小时的调试和研究。 我通过在checkbox上设置以下属性来实现它:

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

另外ImageView可能需要按照http://blog.sachin.name/?p=62中的描述进行配置(感谢那个人)

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

只是为了补充这个被接受的答案:在ImageButton而不是CheckBox情况下,将xml focusablefocusableInTouchMode设置为false是不够的,但在运行时可以将focusable设置为false。 这意味着要确保检测到onItemClick必须像以下一样做:

 button.setFocusable(false); 

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

干杯;)

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