`
gryphone
  • 浏览: 435841 次
  • 性别: 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)

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 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