热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidlistviewOnItemClickListener失效原因

最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。

最近做listview发现OnItemClickListener 失效,在网上看到这篇文章,发现问题所在,因为button的原因。

而且不但listitem中存在button影响OnItemClickListener事件的失效,而且还会直接导致单击后listview每个item的背景改变使item中的所有有关焦点的事件都失效。

下面内容转http://www.cnblogs.com/xilinch/archive/2012/11/07/2759265.html

     listview在android开发中很地方都用到了,通常我们需要定制item里面的视图,就要重写adapter。而item中的控件根据需要来添加。但是如果出现了某些特定的item控件,就可能导致listview 的onItemClickListener不起作用。

    下面是一个范例,说明这种情况。

     首先还是先看代码:

  布局xml文件如下:

View Code

  item布局xml如下:

View Code

注意里面有一个ImageButton。

在activity中设置listview的onItemClickListener,需要做的事情就是当点击item的时候出现log信息,代码如下:

View Code

listView.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView parent, View view,int position, long id){// TODO Auto-generated method stubLog.i("mm", " onItemClick ");}});

 

以及设置listview的onTouchListener,需要的事情只是当touch的时候MotionEvent的事件,代码如下:

View Code

listView.setOnTouchListener(new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event){// TODO Auto-generated method stubif(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");}return false;}});

 

在adapter中设置ImageButton的onClicklistener,需要做的事情只是打出log信息,代码如下:

View Code

holder.iv_call.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){// TODO Auto-generated method stubLog.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的焦点失去,从不能响应。因此需要仔细分析,问题导致的具体原因,才更好的解决问题。



推荐阅读
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
author-avatar
mobiledu2502861767
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有