CheckBox在ListView 而导致其OnItemClickListener不会被触发

CheckBox在ListView 而导致其OnItemClickListener不会被触发

 

 

这个标题实在有点长  没办法而为之 本人语言实在乏善可陈   故开题之前 重新描述之

 

写道
ListView 中的各个item 通过 extends BaseAdapter 可以显示任意子View 当然也包括CheckBox

但是 当使用CheckBox 会导致ListView.setOnItemClickListener(OnItemClickListener listener) 中的listener不会被回调

 

 

通过Google 得到以下解释:

 

写道
ListView的item中加入CheckBox后 导致ListView对OnItemClick事件无法响应 原因是因为CheckBox的事件响应优先级高于List Item,所以屏蔽了ListItem的单击事件

 

 

而解决办法是:

 

写道
设置CheckBox的android:focusable="false"即可

 

 

 

但是 我设置以后 依然无效  只能再想别的办法   以下即为步骤:

 

 

 

[代码 步骤]

 

 

1. 鉴于今天重点以ListView 响应OnItemClickListener   故打算其显示item 数据以联系人数据为例

 

- 查询目标Uri

 

cursor = getContentResolver().query(People.CONTENT_URI, 
                null, null, null, null);

 

- 定义PeopleAdapter 用于接收数据源Cursor 

 

public class PeopleAdapter extends BaseAdapter {
    	Activity activity;
    	
    	public PeopleAdapter(Activity a){
    		activity = a;
    	}
    	
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return cursor.getCount();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public View getView(int arg0, View arg1, ViewGroup arg2) {
			// TODO Auto-generated method stub
			return CheckTest(arg0);
		}
		
		public View CheckTest(int position){
			cursor.moveToPosition(position);
			String name = cursor.getString(cursor.getColumnIndex("name"));
			
			CheckBox cb = new CheckBox(activity);
			cb.setText(name);
			cb.setFocusable(false);
			
			return cb;
		}

    }

 

 

 

 2.  emulator 运行截图

 

 

 

 

 

 

3.  通过ListView.setOnItemClickListener(...) 监听 onItemClick()  但是会失效

 

lv.setOnItemClickListener(new OnItemClickListener(){

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
				Log.d("TAG","onItemClick id:"+arg2);
			}
        	
        });

 

 

 

4.   下面就涉及 如何解决

 

写道
正式开始之前 说说其实现原理:

CheckBox 与 ListView.onItemClick() 冲突原因 前面说过 因为优先级问题

那么如果二者所占用的区域不同呢? 即:

CheckBox 的区域 就是 CheckBox 本身

而ListView.onItemClick() 监听 可以通过如下:


把CheckBox 放入LinearLayout , 如果单击区域是属于CheckBox 那显然就会执行CheckBox默认行为 即置CheckBox true/false , 如果单击区域处于CheckBox 外 但又属于LinearLayout 那么就视该动作 为ListView.onItemClick()

 

 

5.  定义2个int变量 作为CheckBox LinearLayout 的 id 索引起点

 

public final int LAYOUT_INDEX = 0;
public final int CHECKBOX_INDEX = 100;

 

 

 

6.  定义ListView 中 item 的布局 并设立CheckBox LinearLayout 的监听器

 

public View fromLayout(int position){
			cursor.moveToPosition(position);
			String name = cursor.getString(cursor.getColumnIndex("name"));

			final LinearLayout layout = new LinearLayout(activity);
	        layout.setOrientation(LinearLayout.HORIZONTAL);
	        layout.setId(position+LAYOUT_INDEX);
	        
			final CheckBox cb = new CheckBox(activity);
			cb.setText(name);
			cb.setBackgroundColor(Color.GRAY);
			
			cb.setId(CHECKBOX_INDEX+position);

			cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){

				@Override
				public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
					// TODO Auto-generated method stub
					int id = cb.getId() - CHECKBOX_INDEX;
					boolean status = arg1;
					
					popMessage("CheckBox.onCheckedChanged",id);
				}
				
			});
			
			layout.addView(cb);
			
			layout.setOnClickListener(new OnClickListener(){

				@Override
				public void onClick(View arg0) {
					// TODO Auto-generated method stub
					id = arg0.getId() - LAYOUT_INDEX;
					
					popMessage("Layout.onClick",id);
				}
				
			});
			
			
			return layout;
		}

 

 

7.  在PeopleAdapter.getView(int arg0, View arg1, ViewGroup arg2) 使用 fromLayout()    其中 popMessage() 用于通知点击区域和id

 

public void popMessage(String prefix,int id){
    	String msg = "["+prefix+"].ID:"+id;
    	Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
    }

  

 

8. emulator 运行截图  // 为了标记CheckBox显示区域 我用setBackgroundColor(Color.GRAY) 设定其颜色 便于观察

 

- 点击CheckBox

 

 

 

 

 

 

- 点击其他区域(非CheckBox)

 

 

 

 

 

 

鉴于语言所限 防止有人看不懂 故贴出研究代码 大家自己运行 应该就能理解之了  对了  别忘记顶贴哦!!!!!!

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值