- 浏览: 433478 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
yehuiyan8002:
支持中文查询
快熟查找联系人 -
lehehe:
现成的接口,免费试用,http://www.haoservic ...
天气Widget -
D.Z:
android:focusable="false&q ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
freecode:
碰到该问题,CheckBox的android:focusabl ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
echohfut:
哥们,新博客是不是在墙外啊?不能访问。还有你怎么进行博客迁移的 ...
博客 迁移
CheckBox在ListView 而导致其OnItemClickListener不会被触发
这个标题实在有点长 没办法而为之 本人语言实在乏善可陈 故开题之前 重新描述之
但是 当使用CheckBox 会导致ListView.setOnItemClickListener(OnItemClickListener listener) 中的listener不会被回调
通过Google 得到以下解释:
而解决办法是:
但是 我设置以后 依然无效 只能再想别的办法 以下即为步骤:
[代码 步骤]
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)
鉴于语言所限 防止有人看不懂 故贴出研究代码 大家自己运行 应该就能理解之了 对了 别忘记顶贴哦!!!!!!
- CheckListTest.rar (31.9 KB)
- 下载次数: 667
评论
Thanks.
给你需要的布局设置:
android:focusable="true"
android:focusableInTouchMode="true"
其他组件(不包括布局)
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="true"
就可以了,这样既不会影响listview,也不会影响button
没看内容
内容太长了
最简单的办法直接把checkbox的focusable 设为false就OK了 哪那么多废话
boolean checked
onItemClick(int postiion){
if(data.get(position).checked){
data.get(position).checked= false;
}else{
data.get(position).checked = true;
}
adapter.notifyDateChange();
}
目前为止 这是我发现的最简单的解决办法了
设置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区域).
目前为止 这是我发现的最简单的解决办法了
设置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. }
目前为止 这是我发现的最简单的解决办法了
设置CheckBox的android:focusable="false"是可以做到的,可能是你其他的View设置有问题,
我的很多代码都是使用此方法,不管是CursorAdapter还是ListAdapter,均没问题。
目前为止 这是我发现的最简单的解决办法了
发表评论
-
滑动抽屉 另一种解决办法
2010-07-09 17:43 0滑动抽屉 -
Spinner 定制化 增强版
2010-07-09 14:34 2608Spinner 作为下拉选 ... -
ListView 内容之分批显示
2010-06-25 20:38 5923ListView 内容循环显示 大家试想 假如 ... -
MediaScanner 研究
2010-06-23 15:21 3168MediaScanner 之所以拿MediaSc ... -
获取Launcher 启动列表
2010-06-22 10:09 3137获取Launcher 启动列表 即 列出所有Launc ... -
PreferenceActivity 全接触
2010-06-19 12:53 9438PreferenceActivity 为了引入 ... -
android src 下载 编译 安装 全接触
2010-06-12 14:44 0android src - download install ... -
Intent.createChooser() 妙用
2010-06-12 11:14 5955Intent.createChooser(ntent targ ... -
SMS管理:收信箱 发信息 编写新信息
2010-06-07 08:14 14442SMS管理 [功能] 1. 收信箱:显示 ... -
求 android 手机 帮忙测试sms服务系统 谢谢
2010-06-05 08:25 1449Hi guys, 最近一段时间没有更新blog 因为一 ... -
流媒体 播放 理论篇
2010-05-28 14:42 2219流媒体播放 之所以为理论篇 因为该篇仅实现了播放功能 ... -
NDK 搭建与HelloWorld
2010-05-19 09:48 3224NDK [前提] 1. Cygwin 用于安装 ... -
自定义字体
2010-05-15 10:49 1220自定义字体: []代码 步骤] 1 ... -
模糊查找 再深入
2010-05-15 09:41 3157模糊查找 再深入 应某位大哥要求 再次对 SQLite ... -
快捷方式Bar + ViewGroup - 自定义
2010-05-09 09:20 2469TabActivity - 自定义 其实 这篇感觉极鸡 ... -
View 拖动&插入 研究
2010-05-09 07:14 3982View 拖动&插入 即: ... -
带图标 快捷键 Menu - 终极版
2010-05-04 20:23 1837Menu 改头换面 扩展如下: 1. 图标化文字 2 ... -
*.gif 解码 - 实践
2010-05-02 18:58 1733*.gif decode 前面已经说过 今天不打算再说了 ... -
*.gif 解码 - 理论
2010-05-01 21:11 1521我们知道Android 默认是不支持*.gif 的 但是 ... -
shortcut+livefolder
2010-04-19 13:08 1493shortcut+livefolder Live ...
相关推荐
为了增加用户交互性,我们经常会在ListView的每一项中添加CheckBox,这样用户就可以进行多选操作。本篇文章将详细讲解如何在ListView中实现CheckBox复选框的功能。 首先,我们需要创建一个自定义的ListView适配器。...
Button在ListView中的用途可能包括触发某种操作或改变某个状态。同样,我们需要在`getView()`中为每个Button设置OnClickListener,监听其点击事件。在事件处理回调中执行相应操作,比如发送网络请求或改变当前Item的...
本篇文章将详细探讨如何在ListView中结合Checkbox实现多选功能。 ### 1. ListView的基本使用 首先,我们需要了解ListView的基础用法。在布局文件中声明ListView,并在Java代码中找到对应的View对象,然后通过...
在ListView的item布局文件中添加CheckBox,并将其与数据项绑定。在Adapter的`getView()`方法中,根据数据项的选中状态设置CheckBox的选中状态。 8. **触摸事件处理**: 需要处理ListView的触摸事件,以便在用户...
- 在ListView的每个条目中添加CheckBox,可以通过在Adapter的`getView()`方法内为ListView的每行布局设置CheckBox,并监听其点击事件。 5. **多选机制**: - 可以使用SparseBooleanArray来存储选择状态。 ...
然而,在实际应用中,直接在ListView中使用Checkbox时,经常会出现ListView的OnItemClickListener事件与Checkbox的选择事件发生冲突的问题。为了解决这个问题,我们需要进行一些特殊的处理。 首先,来看list_item....
- 当使用`CHOICE_MODE_MULTIPLE`时,`onItemClick`方法不会触发,而是`setOnItemClickListener`无效,应使用`setOnItemCheckedChangeListener`。 5. **保存和恢复选择状态** - 当应用重新启动或ListView被刷新时...
在Android开发中,ListView和ExpandableListView是两个常用的视图组件,用于展示可滚动的数据列表。本项目聚焦于如何在这些组件中实现单选、多选、全选功能,并利用EditText进行批量输入操作。以下是对这些知识点的...
在getView()方法中,为每个列表项设置一个Checkbox,并将其与数据项关联。可以通过设置Checkbox的tag属性来保存每个条目的唯一标识,便于后续操作。 2. **记录选中状态**: 根据描述,使用HashMap来存储选中或未...
综上所述,在Android开发中,如果希望`ListView`能够优先响应点击事件,而不是其子视图,可以通过调整子视图的`focusable`属性以及设置`descendantFocusability`属性为`blocksDescendants`来实现。这样既保证了用户...
1. 设置OnLongClickListener:在ListView上设置监听器,当用户长按时触发相关代码。 ```java listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean ...
10. **优化性能**: 在处理大量数据时,为避免一次性加载过多视图导致内存消耗,可以使用convertView参数在getView()方法中进行视图复用,以提高ListView的滚动性能。 11. **SharedPreferences**: 如果需要保存用户...
- 也可以监听CheckBox的CheckedChangeListener,但要注意防止无限循环(因为CheckBox的状态改变会触发ListView的点击事件)。 6. **选择范围控制** - 如果需要限制可选项目的数量,可以在点击事件处理中添加条件...
CheckedTextView是内置支持选中状态的文本视图,而RadioButton则需要在ListView的每个条目内部嵌套在一个RadioGroup中。单选时,每次点击条目,都会检查当前选中的RadioButton,并取消其他RadioButton的选中状态。这...
为了实现“不规则点击”,开发者可能需要重写`onItemClickListener`或`onItemLongClickListener`方法,为不同的条目或者在不同的条件下触发不同的行为。例如,点击某个位置的条目时,可能需要弹出一个对话框,或者在...
如果有更高优先级的控件如Button、RadioButton或CheckBox,可能需要设置这些控件的`android:focusable="false"`以确保ListView的点击事件正常触发。 7. **保持滚动条始终显示**: 若要防止滚动条自动隐藏,可以在...
在Android应用开发中,ListView是显示大量数据列表的常用组件,而实现ListView的左右联动功能可以为用户带来更丰富的交互体验。左右联动通常指的是当用户在ListView中的某一项上进行操作时,右侧或其他相关组件会...
为了使CheckBox能够正确地绑定到每个item,我们需要在`ListVIewAdapter`的`getView`方法中创建CheckBox,并将其添加到ListView的每个item中。在这个方法中,我们通常会使用`ViewHolder`模式来提高列表的渲染性能。...
在Android开发中,ListView是常用的一种组件,用于展示可滚动的列表数据。然而,在实际应用中,有时可能会遇到设置`setOnItemClickListener`后点击事件无效的情况。本文将深入探讨这个问题的原因,并提供解决方案。 ...
在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。SQLite则是一个轻量级的数据库系统,常用于存储应用内的结构化数据。本教程将介绍如何在Android应用中使用ListView显示SQLite数据库中的数据...