为何我的listviewlistview的点击事件件OnItemClickListener,一点就直接退出了

这次做课程设计,虽然做的很粗糙,但是在做的过程还是积累了一些东西,有动手就会有收获,这里记录一些吧。
listview在android开发中很地方都用到了,通常我们需要定制item里面的视图,就要重写adapter。而item中的控件根据需要来添加。但是如果出现了某些特定的item控件,就可能导致listview的onItemClickListener不起作用。
以下转载自网上找到的一个解决办法,这里感谢他提供非常实用的办法!
首先贴现我的item定义的视图
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:background=&@color/white&
android:descendantFocusability=&blocksDescendants& &
&ImageView
android:id=&@+id/iv_file_icon&
android:layout_width=&40dp&
android:layout_height=&40dp&
android:layout_centerVertical=&true&
android:layout_marginLeft=&10dp&
android:src=&@drawable/folder& /&
&ImageButton
android:id=&@+id/ibtn_file_operate&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_alignParentRight=&true&
android:background=&@drawable/btn_file_operate&
android:focusable=&false&
&LinearLayout
android:layout_width=&0dp&
android:layout_height=&wrap_content&
android:layout_centerVertical=&true&
android:layout_marginLeft=&18dp&
android:layout_toLeftOf=&@id/ibtn_file_operate&
android:layout_toRightOf=&@id/iv_file_icon&
android:orientation=&vertical& &
android:id=&@+id/tv_file_name&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:singleLine=&true&
android:text=&@string/tv_file_name&
android:textColor=&@color/black&
android:textSize=&15sp& /&
android:id=&@+id/tv_file_msg&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_marginTop=&4dp&
android:text=&@string/tv_file_msg&
android:textColor=&@color/grey&
android:textSize=&12sp& /&
&/LinearLayout&
&/RelativeLayout&
注意里面有一个ImageButton。
在activity中设置listview的onItemClickListener,需要做的事情就是当点击item的时候出现log信息,代码如下:
&span style=&font-size:14&&listView.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView&?& parent, View view,
int position, long id)
// TODO Auto-generated method stub
Log.i(&mm&, & onItemClick &);
});&/span&
以及设置listview的onTouchListener,需要的事情只是当touch的时候MotionEvent的事件,代码如下:
listView.setOnTouchListener(new OnTouchListener()
public boolean onTouch(View v, MotionEvent event)
// TODO Auto-generated method stub
if(event.getAction() == MotionEvent.ACTION_DOWN)
Log.i(&mm&, &MotionEvent.ACTION_DOWN&);
else if(event.getAction() == MotionEvent.ACTION_UP)
Log.i(&mm&, &MotionEvent.ACTION_UP&);
else if(event.getAction() == MotionEvent.ACTION_MOVE)
Log.i(&mm&, &MotionEvent.ACTION_MOVE&);
在adapter中设置ImageButton的onClicklistener,需要做的事情只是打出log信息,代码如下:
holder.iv_call.setOnClickListener(new OnClickListener()
public void onClick(View v)
// TODO Auto-generated method stub
Log.i(&mm&, &holder.iv_call.setOnClickListener &);
好了,以上都做完了,接下来运行工程。出现界面以后,我们来使劲的点item位置(除了imageButton),
结果log中没有出现打印的
Log.i(&mm&, & onItemClick &);
接下来拖动item看看touch事件
打出log如下:
11-07 08:42:27.793: I/mm(540): MotionEvent.ACTION_MOVE
11-07 08:42:28.681: I/mm(540): MotionEvent.ACTION_MOVE
11-07 08:42:28.832: I/mm(540): MotionEvent.ACTION_MOVE
11-07 08:42:28.992: I/mm(540): MotionEvent.ACTION_UP
&大家可以看到没有action_down事件,也就是没有了点击事件,一个完整的touch是down--move--move--up,而这里没有了,这是为什么呢?
再点击imagButton,看看打印信息:
11-07 08:44:31.131: I/mm(540): holder.iv_call.setOnClickListener
& & 出现了我们期望的打印信息。
& & 在这里总结一下上面问题出现背景,item中有ImageButton,其余和平常使用listview一样的.当点击item时,onItemClickListener不起作用,ontouchListener中motionEvent.down消失了,事件只有点击item中的imagButton起作用。
& & 我们分析一下,当item出现了imageButton时,onItemClickListener不起作用,而在Touch中没有了down事件,首先说明onItemClickListener处理的和MotionEvent的down事件有关,然后问题的关键是这个down事件去了哪里呢?
& & 经过排查当item中有Checkable类以及Button类控件的时候,item的焦点会被子项获得,此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。从而导致onItemClickListener不起作用。
& & 已经得知了问题导致的原因就是因为item没有获得焦点,焦点被子项拿走了,那么怎么解决这类问题?本人认为处理的途径无非就是通过设置子项不能获得焦点,同时item要获得焦点。 &
& & 这里采用的方法,要用到两个属性:
android:focusable=&false&
这个属性的具体介绍可以i看我上一篇文章,设置的目的在于使得某个控件不能获得焦点。
android:descendantFocusability=&blocksDescendants&
这个属性用来设置子项焦点的处理先后顺序。
android:descendantFocusability
Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.
Must be one of the following constant values.
android:beforeFocusability& & &viewgroup在子项处理之前获得焦点
android:afterFocusability & & & & & &viewGroup在子项处理之后获得焦点
android:blocksFocusability & & & & &viewGroup阻止子项获得焦点
上面就是说子项焦点能力,定义了viewgroup和它的子元素处理的关系,这关系是指当一个view在获得焦点的时候,值必须是下面的常量之一。
& & & &那么,我们肯定imageButton不能获得焦点,因此添加ImageButton属性&focusable=&false&,同时我们希望item中子项不能获得焦点,所以要把给android:descendantFocusability=&blocksDescendants&属性添加到imageButton的父元素即可,简单的做可以设置item的根节点上。
& & & 以上作完后,我们在测试一下。
& & &点击item,出现以下log:
11-07 09:48:19.671: I/mm(1077): MotionEvent.ACTION_DOWN
11-07 09:48:19.751: I/mm(1077): MotionEvent.ACTION_UP
11-07 09:48:19.952: I/mm(1077):
onItemClick
& &touch事件有了,ItemClick也有有了,
& & 再次imageButton,出现以下log:
11-07 09:50:01.673: I/mm(1077): holder.iv_call.setOnClickListener
& & 说明点击ImageBUtton也获得点击事件。& &&
& & 以上完美的解决问题了。
& & 总结:本次出现的onItemClickListener不能响应的原因是在item中有button类(子类)或者checkable类(子类)控件导致了item的焦点在子项的控件上,处理的办法就是将子项的控件焦点去掉,同时在item中xml设置阻止子项获得焦点的属性,即可解决尚需问题
& &综述: 出现onItemClickListener不能响应,原因可能有多种,本人总结了有两种情况,一种是isEnable中返回值为false导致不能点击和选择,一种是因为item中有了checkable或者button类(子类)控件导致了item的焦点失去,从不能响应。因此需要仔细分析,问题导致的具体原因,才更好的解决问题。
本文已收录于以下专栏:
相关文章推荐
最近在做项目的过程中,在使用listview的时候遇到了设置item监听事件的时候在没有回调onItemClick 方法的问题。我的情况是在item中有一个Button按钮。所以不会回调。...
正常情况下,为listview设置的setOnItemClickListener后,当用户dian
要实现这样的一个功能:
一个ListView,能向左滑动出现删除按钮,点击item进入详情,长按item进入编辑
也就是说要做到滑动、点击、长按三个动作互不干扰,滑动时间长了不能触发长按,滑动后手...
如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效,
事件会被子View捕获到,L...
这篇文章主要介绍了Android 中ListView setOnItemClickListener点击无效原因分析的相关资料,需要的朋友可以参考下前言最近在做项目的过程中,在使用listview的时候...
如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效,
事件会被子View捕获到,L...
给Listview里面Item里的每一个控件怎么设定点击事件
adpter用的是继承的baseadapter,给整个listview上的Item设置点击事件就用listview.setOnItemCl...
同样是在上一篇文章中代码,我们给Acitvity中的mView添加一个监听器:myView.setOnClickListener(new OnClickListener() {
@Overri...
哈哈哈 第一次写自定义啦。。。。。
* 视频进度条
public class ProgressView extends View ...
当我们使用ListView或GridView的时候,当列表为空的时候,我们往往需要一个Loading或者一段提示文字又或者一个特殊的View来提示用户操作,这个时候就用到了setEmptyView()...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)android中ListView控件 通过onItemClick点击事件传递参数源码
Android平台开发
开发语言:Java
实例大小:1.43KB
下载次数:
浏览次数:
发布时间:
实例类别:Android平台开发
发 布 人:
所需积分:0
&相关标签:
同类人气实例
实例下载地址
android中ListView控件 通过onItemClick点击事件传递参数源码
不能下载?内容有错? 点击这里报错
好例子网口号:伸出你的我的手 & 分享!
1 楼 lck0213 发表于:
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
Copyright &
好例子网(www.haolizi.net).All Rights Reserved备案编号:冀ICP备号 石公备号(10)11:15 提问
ListView中OnItemClickListener事件不能执行
Activity类:
private String[] mStrings2={"Title 01","Title 02"};
private String[] mStrings = {"Link to the image1", "Link to the image2"};
mainList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView&?& arg0, View arg1, int arg2, long arg3) {
adapter=new LazyAdapter(this, mStrings, mStrings2);
subList.setAdapter(adapternew);
MyAdapter class (MyAdapter.java)
private String[]
private String[] data2;
private static LayoutInflater inflater=
public ImageLoader imageL
//Constructor
public LazyAdapter(Activity a, String[] d, String[] mStrings2) {
activity =
data2=mStrings2;
inflater = LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
当我点击第一个 List Item,我想把元素加载到第二个数组中。但是当执行程序后,获得NullPointerException异常。就是说ListView中OnItemClickListener事件不能执行。大家能指导下哪出错了吗?
12-04 14:21:42.499: E/AndroidRuntime(1429): java.lang.NullPointerException
12-04 14:21:42.499: E/AndroidRuntime(1429):
at com.java.hotelapp.Item_List$1.onItemClick(Item_List.java:106)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.widget.AdapterView.performItemClick(AdapterView.java:282)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.widget.AbsListView.performItemClick(AbsListView.java:1037)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2449)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.widget.AbsListView$1.run(AbsListView.java:3073)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.os.Handler.handleCallback(Handler.java:587)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.os.Handler.dispatchMessage(Handler.java:92)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.os.Looper.loop(Looper.java:132)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at android.app.ActivityThread.main(ActivityThread.java:4123)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at java.lang.reflect.Method.invokeNative(Native Method)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at java.lang.reflect.Method.invoke(Method.java:491)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
12-04 14:21:42.499: E/AndroidRuntime(1429):
at dalvik.system.NativeStart.main(Native Method)
按赞数排序
adapter=new LazyAdapter(this, mStrings, mStrings2);
subList.setAdapter(adapternew);
adapternew是啥,改为adapter试试
adapter=new LazyAdapter(this, mStrings, mStrings2);
传this不会报编译时错误???
subList是null,检查在哪里初始化的。
subList是null,检查在哪里初始化的。
其他相关推荐listview 的onitemlongclick阿和onitemclick冲突,item中还有button的点击事件
listview里面item有button的,button要设置 android:focusable=&false& &,listview里面如果设置了 onitemlongclick事件,那么onitemclick事件就不响应,我们只需要在onitemlongclick中返回true就可以解决问题了
// 显示长按删除按钮
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView&?& arg0, View arg1,
int arg2, long arg3) {
// 循环隐藏之前显示的按钮
if (btn_del_list != null && btn_del_list.size() & 0) {
for (int i = 0; i & btn_del_list.size(); i++) {
if (i != arg2) {
btn_del_list.get(i).setVisibility(View.GONE);
//当前的这个显示
Button btn = (Button) arg1.findViewById(R.id.btn_del);
btn.setVisibility(View.VISIBLE);listView的onItemClickListener如何得到ID?【android开发吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:119,767贴子:
listView的onItemClickListener如何得到ID?收藏
想让代码简洁一点,有多个LISTVIEW要监听点击事件,implements了接口如何能区别出是哪个LISTVIEW?
专为满足各类行业和客户要求而设计,并已被证明可满足各个施工标准的要求。
switch那个position的整形参数
为每个listview设置position
onItemClick方法里面有一个AdapterView就是对应的ListView
用构造传一个自定义的标签tag,new出监听接口时根据不同的需求传入tag
将listview返回就知道哪个了啊
可以用 butterknife框架
登录百度帐号推荐应用

我要回帖

更多关于 安卓listview点击事件 的文章

 

随机推荐