`
gryphone
  • 浏览: 433478 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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)

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

分享到:
评论
21 楼 D.Z 2014-05-27  
android:focusable="false" 解决问题。
Thanks.
20 楼 freecode 2012-12-12  
碰到该问题,CheckBox的android:focusable="false"可以解决
19 楼 柔情浪子 2011-09-27  
不错,顶起
18 楼 wxw404 2011-07-12  
也许这样可以,
给你需要的布局设置:
android:focusable="true"
android:focusableInTouchMode="true"

其他组件(不包括布局)
android:focusable="false"
android:focusableInTouchMode="false"
17 楼 蓝月儿 2011-01-19  
顶一个 把控件放布局文件里了,还没重写OnItemClick事件,不过现在还没用到
16 楼 Coding.Ghost 2010-12-12  
我也是将焦点属性设置为false.然后touch模式的焦点也设置为false.将checkBox的事件写在adapter里面.就不会有问题了.
15 楼 wdsgyj 2010-12-08  
可不可以这样理解,楼主的方式相当于在滚动的过程中(不断地触发 getView 方法)不断地产生各种 listener 对象进行监听?
14 楼 greenboy1 2010-11-28  
好文章哦 呵呵 很不错
13 楼 violetluna 2010-11-04  
android:focusable="false" android:focusableInTouchMode="false"
android:clickable="true"

就可以了,这样既不会影响listview,也不会影响button
12 楼 herrylioi 2010-10-19  
可以使用CheckBoxPreference啊 使用SharedPreference的方式来保存信息
11 楼 lijunjie 2010-09-08  
恩。最关键的就是focusable=false.对我很有帮助
10 楼 lccly 2010-09-08  
我也是用的楼主这种方法,问题已经解决了~~
9 楼 xiaofanqingzjj 2010-09-08  
我只看了标题
没看内容
内容太长了
最简单的办法直接把checkbox的focusable 设为false就OK了  哪那么多废话
8 楼 zhuixinjian 2010-06-29  
一般这种列表中带checkbox的,我都载对象中定义一个字段。

boolean checked

onItemClick(int postiion){
   if(data.get(position).checked){
        data.get(position).checked= false;
   }else{
         data.get(position).checked = true;
     }

  adapter.notifyDateChange();

}


7 楼 carywei 2010-06-29  
gryphone 写道
sinfrancis 写道
gryphone 写道
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了



设置CheckBox的android:focusable="false"是可以做到的,可能是你其他的View设置有问题,
我的很多代码都是使用此方法,不管是CursorAdapter还是ListAdapter,均没问题。

我也不知道为什么失败 我也设定了啊 

public View CheckTest(int position){   
33.            cursor.moveToPosition(position);   
34.            String name = cursor.getString(cursor.getColumnIndex("name"));   
35.               
36.            CheckBox cb = new CheckBox(activity);   
37.            cb.setText(name);   
38.            cb.setFocusable(false);   
39.               
40.            return cb;   
41.        }

==================================================================
你这样用,其实一个Item就是一个checkBox,当然设计无效了,你用Layout包含Checkbox的时候,checkbox就好用了。因为这时候checkbox不在占据一行了。
如果你使用xml文件配置这个item布局的话,通常放到某一个Layout里面,在xml文件设计android:focusable="false"是可以的。其实原理是一样的。(只是你理解有点问题,就是checkBox直接显示,就当作一行都是checkbox区域).
6 楼 gryphone 2010-06-24  
sinfrancis 写道
gryphone 写道
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了



设置CheckBox的android:focusable="false"是可以做到的,可能是你其他的View设置有问题,
我的很多代码都是使用此方法,不管是CursorAdapter还是ListAdapter,均没问题。

我也不知道为什么失败 我也设定了啊 

public View CheckTest(int position){   
33.            cursor.moveToPosition(position);   
34.            String name = cursor.getString(cursor.getColumnIndex("name"));   
35.               
36.            CheckBox cb = new CheckBox(activity);   
37.            cb.setText(name);   
38.            cb.setFocusable(false);   
39.               
40.            return cb;   
41.        }
5 楼 sinfrancis 2010-06-23  
gryphone 写道
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了



设置CheckBox的android:focusable="false"是可以做到的,可能是你其他的View设置有问题,
我的很多代码都是使用此方法,不管是CursorAdapter还是ListAdapter,均没问题。
4 楼 gryphone 2010-06-23  
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了
3 楼 zcbbupt 2010-06-23  
好东西,学习啦!
2 楼 rainsf 2010-06-23  
不知有没有简单点的方法呢

相关推荐

    ListView添加CheckBox复选框

    为了增加用户交互性,我们经常会在ListView的每一项中添加CheckBox,这样用户就可以进行多选操作。本篇文章将详细讲解如何在ListView中实现CheckBox复选框的功能。 首先,我们需要创建一个自定义的ListView适配器。...

    带下拉刷新的ListView的中同时处理CheckBox,Button,和item事件

    Button在ListView中的用途可能包括触发某种操作或改变某个状态。同样,我们需要在`getView()`中为每个Button设置OnClickListener,监听其点击事件。在事件处理回调中执行相应操作,比如发送网络请求或改变当前Item的...

    listview+checkbox 多选

    本篇文章将详细探讨如何在ListView中结合Checkbox实现多选功能。 ### 1. ListView的基本使用 首先,我们需要了解ListView的基础用法。在布局文件中声明ListView,并在Java代码中找到对应的View对象,然后通过...

    ListView嵌套ListView带多选,全选,反选,选中数量

    在ListView的item布局文件中添加CheckBox,并将其与数据项绑定。在Adapter的`getView()`方法中,根据数据项的选中状态设置CheckBox的选中状态。 8. **触摸事件处理**: 需要处理ListView的触摸事件,以便在用户...

    安卓listview相关相关-listview实现checkbox多选效果可动态加载数据完美融合.rar

    - 在ListView的每个条目中添加CheckBox,可以通过在Adapter的`getView()`方法内为ListView的每行布局设置CheckBox,并监听其点击事件。 5. **多选机制**: - 可以使用SparseBooleanArray来存储选择状态。 ...

    Android编程之listView中checkbox用法实例分析

    然而,在实际应用中,直接在ListView中使用Checkbox时,经常会出现ListView的OnItemClickListener事件与Checkbox的选择事件发生冲突的问题。为了解决这个问题,我们需要进行一些特殊的处理。 首先,来看list_item....

    安卓listview相关相关-ListView的全选反选.rar

    - 当使用`CHOICE_MODE_MULTIPLE`时,`onItemClick`方法不会触发,而是`setOnItemClickListener`无效,应使用`setOnItemCheckedChangeListener`。 5. **保存和恢复选择状态** - 当应用重新启动或ListView被刷新时...

    android listview,ExpandableListView实现单选,多选,全选,edittext实现批量输入.zip

    在Android开发中,ListView和ExpandableListView是两个常用的视图组件,用于展示可滚动的数据列表。本项目聚焦于如何在这些组件中实现单选、多选、全选功能,并利用EditText进行批量输入操作。以下是对这些知识点的...

    listview多选

    在getView()方法中,为每个列表项设置一个Checkbox,并将其与数据项关联。可以通过设置Checkbox的tag属性来保存每个条目的唯一标识,便于后续操作。 2. **记录选中状态**: 根据描述,使用HashMap来存储选中或未...

    listview响应优先

    综上所述,在Android开发中,如果希望`ListView`能够优先响应点击事件,而不是其子视图,可以通过调整子视图的`focusable`属性以及设置`descendantFocusability`属性为`blocksDescendants`来实现。这样既保证了用户...

    Listview 长按弹出菜单

    1. 设置OnLongClickListener:在ListView上设置监听器,当用户长按时触发相关代码。 ```java listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean ...

    安卓listview相关相关-ListViewCheckBox实现全选全不选删除.rar

    10. **优化性能**: 在处理大量数据时,为避免一次性加载过多视图导致内存消耗,可以使用convertView参数在getView()方法中进行视图复用,以提高ListView的滚动性能。 11. **SharedPreferences**: 如果需要保存用户...

    android list View多选

    - 也可以监听CheckBox的CheckedChangeListener,但要注意防止无限循环(因为CheckBox的状态改变会触发ListView的点击事件)。 6. **选择范围控制** - 如果需要限制可选项目的数量,可以在点击事件处理中添加条件...

    LIstView的多选和单选

    CheckedTextView是内置支持选中状态的文本视图,而RadioButton则需要在ListView的每个条目内部嵌套在一个RadioGroup中。单选时,每次点击条目,都会检查当前选中的RadioButton,并取消其他RadioButton的选中状态。这...

    不规则点击ListView案例

    为了实现“不规则点击”,开发者可能需要重写`onItemClickListener`或`onItemLongClickListener`方法,为不同的条目或者在不同的条件下触发不同的行为。例如,点击某个位置的条目时,可能需要弹出一个对话框,或者在...

    Android ListView

    如果有更高优先级的控件如Button、RadioButton或CheckBox,可能需要设置这些控件的`android:focusable="false"`以确保ListView的点击事件正常触发。 7. **保持滚动条始终显示**: 若要防止滚动条自动隐藏,可以在...

    Android中ListView左右联动

    在Android应用开发中,ListView是显示大量数据列表的常用组件,而实现ListView的左右联动功能可以为用户带来更丰富的交互体验。左右联动通常指的是当用户在ListView中的某一项上进行操作时,右侧或其他相关组件会...

    Android使用ListView批量删除item的方法

    为了使CheckBox能够正确地绑定到每个item,我们需要在`ListVIewAdapter`的`getView`方法中创建CheckBox,并将其添加到ListView的每个item中。在这个方法中,我们通常会使用`ViewHolder`模式来提高列表的渲染性能。...

    Android 中ListView setOnItemClickListener点击无效原因分析

    在Android开发中,ListView是常用的一种组件,用于展示可滚动的列表数据。然而,在实际应用中,有时可能会遇到设置`setOnItemClickListener`后点击事件无效的情况。本文将深入探讨这个问题的原因,并提供解决方案。 ...

    android开发教程之listview显示sqlite数据

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。SQLite则是一个轻量级的数据库系统,常用于存储应用内的结构化数据。本教程将介绍如何在Android应用中使用ListView显示SQLite数据库中的数据...

Global site tag (gtag.js) - Google Analytics