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

关于listview的setOnItemClickListener失效问题

正常情况下,为listview设置的setOnItemClickListener后,当用户点击listview的子选项item时就会触发改方法,可是有时候特别的苦恼,明明已经为listv

正常情况下,为 listview 设置的 setOnItemClickListener 后,当用户点击 listview 的子选项item时就会触发改方法,可是有时候特别的苦恼,明明已经为 listview 设置了监听,可是就点击 listview 的 item 时,却一点响应都没有,接下来我为大家分析一下。

这是有关事件的分发问题,建议先阅读本人的上一篇博客 android事件的分发机制 ,有了这个基础,我们就能更快的了解这其中的道理。

解释:

我们先来看看事件分发机制的结构图(我自己画的,比较丑)


 我们的listview就是图中的view控件,当然图中的view控件中可以有很多个,它们是一层层把事件传递下去的(假如我们在listview里面放入一个button,那么该button也是view控件,它位于listview的下层),ok,要listview不能够被点击有下面两种可是:

1、被处于listview上面的view给拦截了

 故事:我们把图看成公司的职位关系, 当总部分配一件任务下来,首先拿到的是最上层的领导,如果位于员工listview上层的“领导们”觉得这任务得自己干,那么他就不会把任务分配给下属,自己把任务给办了,这时候员工listview就接受不到任务了。

技术:“领导“就是位于listview上层的控件或者容器,他们拦截的方法是重写dispatchTouchEvent()返回true,就代表拦截掉此任务,而任务会在带空间/容器的onTouchEvent()方法被处理,如果处理不了,则交给他上层的空间/容器的onTouchEvent()处理,直到处理完毕

解决方法:检查listview上层的控件/容器是否重写了dispatchTouchEvent()方法,如果有检查方法是否返回true,如果返回true,则要改成false,默认返回super.onInterceptTouchEvent(ev) ,其值是false。

2、事件被listview的下层处理了

故事:部长listview他觉得该任务太简单,就交给下属处理了,下属处理完事件就被消化了,所以部长listView没做任务

技术:一般情况下,如果你没有重写dispatchTouchEvent()时,它默认是返回false(也就是将事件继续往下分发,触发自己是最下面一层了,那就会自己的onTouchEvent()去处理),所以如果你没有重写listview的dispatchTouchEvent()方法时,listview里面又有可focus的控件(比如button,或者不可focus你自己在控件加上android:focusable="true"属性),这时候listview就会把任务分发给下属了,所以你给他任务(点击它),它也不作任何反应。

解决方法:将listview里面的控件改为的android:focusable属性设为false(或者直接把button换成其他不可focus的控件)

3、焦点问题,如果位于listview上层的抢了焦点,那listview就无法获取焦点了。

解决方法:检查listview上层的控件/容器是否设置了android:focusable="true",有的话直接去掉。


这三点基本上已经解决问题了,如果竟然还没解决试试加上下面这个属性

android:descendantFocusability=""

beforeDescendants:viewgroup会优先其子类控件而获取到焦点 
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点 
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点


 谢谢大家



推荐阅读
  • 这两天用到了ListView,写下遇到的一些问题。首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性:and ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 添加layout_weight后,ListView仍未对齐 - ListView is not aligned even after added layout_weight
    Hereistheoutputofmycode.IcannotgetallviewsalignedineachListViewitem.Ialreadyused ... [详细]
  • 这期内容当中小编将会给大家带来有关怎么在asp.net中获取ListView与gridview中当前行的行号,文章内容丰富且以专业的角度为大家分析和叙述, ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity集成ListActivity来实现,ListActivity的子类无须调用setContentView方法来显示某个 ... [详细]
  • 关于改变ListView选中项的状态方法思路:无论使用哪一个适配器,只需要重写他的getView()方法即可原理:getView方法是用于把创建好的view交给listView用的,所以我们可 ... [详细]
  • 具有顺序标题的ListView ... [详细]
  • Android基础入门教程——2.4.12ExpandableListView(可折叠列表)的基本使用标签(空格分隔):Android基础入门教程本节引言:本节要讲解的Adap ... [详细]
author-avatar
dingzhi521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有