使用PullToRefreshListView时遇到Item点击事件失效问题 解决方法
最近在自己的项目中使用到了以下开源项目:
https://github.com/nanchen2251/pullToRefreshDemo
相关介绍博客如下:
http://www.cnblogs.com/liushilin/p/5687491.html
使用这个小项目做了一个可以上下拉的小程序,不过遇到了一个问题,就是在使用的时候无法为里面的 list_item 写点击事件,准确的说是写完点击事件后也不能用。
后来发现了这个文章:
https://blog.csdn.net/u014360817/article/details/49795271
发现了文中是使用 descendantFocusability 这个属性来进行修正的。
对于 descendantFocusability 这个属性并不是十分的了解,于是在网上继续搜索,发现这个属性在Android编程中还是比较常见的一个设置,这个设置主要是用来保证 ListView 在点击的时候可以获取到焦点。
在下面文章中对于这个属性给了一些解释:
https://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html
以下给出原文内容:
===============================================================
开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点。原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。
这时候就可以使用descendantFocusability来解决啦,API描述如下:
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.

该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了,至此listview点击的灵异事件告一段落。心得:遇到不会不懂的地方除了网上查询资料之外,也可以多多去尝试每种属性的作用,多阅读官方文档(我始终觉得还是读原文的比翻译的理解的会更好)。
以上文字转于:https://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html
===============================================================
文章https://blog.csdn.net/android_gogogo/article/details/53376178
给出了一个布局layout文件作为示列,以下引自该列:
<ListView
android:descendantFocusability="blocksDescendants"
android:focusable="false"
android:divider="@drawable/leftxian1"
android:id="@+id/flfg_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
listview item 中textview:
<TextView
android:focusable="true"
android:padding="5dp"
android:gravity="center_vertical"
android:textColor="@color/black"
android:id="@+id/text_law"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" ></TextView>
值得注意的是,文章:https://www.cnblogs.com/larrylawrence/p/5617038.html
给出了 属性设置为 android:descendantFocusability="blocksDescendants" 的时候应该注意的其它问题:
原文如下:
===============================================================
值得注意的是,ListView中的控件不能设置clickable="true",否则会无视父控件的blockDescendants。
可参考:
https://segmentfault.com/q/1010000005800016
同理,如果一个cardview里面有个listview,这个listview如果设置了clickable="true",遮住cardview的部分也是无法响应的。
===============================================================
http://flysnow.iteye.com/blog/1762556
中给出了更详尽的解释,如下:
Android ViewGroup.setDescendantFocusability函数
这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。
他有三个常量可供设置
- FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理
- FOCUS_AFTER_DESCENDANTS 先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
- FOCUS_BLOCK_DESCENDANTS ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理
Setdescendantfocusability(int focusability)代码
public void setDescendantFocusability(int focusability) {
switch (focusability) {
case FOCUS_BEFORE_DESCENDANTS:
case FOCUS_AFTER_DESCENDANTS:
case FOCUS_BLOCK_DESCENDANTS:
break;
default:
throw new IllegalArgumentException("must be one of FOCUS_BEFORE_DESCENDANTS, "
+ "FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS");
}
mGroupFlags &= ~FLAG_MASK_FOCUSABILITY;
mGroupFlags |= (focusability & FLAG_MASK_FOCUSABILITY);
}
可以看到,只有这三个常量可以设置,不是这三个常量会抛出异常的。
设置后,会在requestFocus(int direction, Rect previouslyFocusedRect) 方法里根据设置进行相应的处理。来看下实现
Requestfocus(int direction, rect previouslyfocusedrect)代码
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
if (DBG) {
System.out.println(this + " ViewGroup.requestFocus direction="
+ direction);
}
int descendantFocusability = getDescendantFocusability();
switch (descendantFocusability) {
case FOCUS_BLOCK_DESCENDANTS:
return super.requestFocus(direction, previouslyFocusedRect);
case FOCUS_BEFORE_DESCENDANTS: {
final boolean took = super.requestFocus(direction, previouslyFocusedRect);
return took ? took : onRequestFocusInDescendants(direction, previouslyFocusedRect);
}
case FOCUS_AFTER_DESCENDANTS: {
final boolean took = onRequestFocusInDescendants(direction, previouslyFocusedRect);
return took ? took : super.requestFocus(direction, previouslyFocusedRect);
}
default:
throw new IllegalStateException("descendant focusability must be "
+ "one of FOCUS_BEFORE_DESCENDANTS, FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS "
+ "but is " + descendantFocusability);
}
}
=========================================================================
文章
https://segmentfault.com/q/1010000005800016
给出了其它的几种解决方法,个人觉得还是有可能搞定,不过由于个人客观因素所限制并没有给出具体实现验证,下面给出其中内容:

使用PullToRefreshListView时遇到Item点击事件失效问题 解决方法的更多相关文章
- [转]iOS Safari 中click点击事件失效的解决办法
iOS Safari 中click点击事件失效的解决办法 问题起因: 在微信公众号开发(微站)过程中用jquery的live方法绑定的click事件点击无效(不能执行) 问题描述 当使用委托给一个元素 ...
- Android ListView中Item点击事件失效解决方案
欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...
- Android ListView item 点击事件失效问题的解决
关于ListView点击无效,item无法相应点击事件的问题,网上有很多, 大致可分为俩种情况, 一种是 item中存在 ImageButton 等可以点击的组件,这会抢先获得ListView的焦点. ...
- iOS Safari 中click点击事件失效的解决办法
问题起因: 在微信公众号开发(微站)过程中用jquery的live方法绑定的click事件点击无效(不能执行) 问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document ...
- iOS Safari 中点击事件失效的解决办法
问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. ...
- 【javascript】iOS Safari 中点击事件失效的解决办法
问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. ...
- ajax局部刷新后里面的jquery事件失效的解决方法
live() 与bind()作用基本一样. 最重要区别:live()可以将事件绑定到当前和将来的元素(eg:为id=zy元素绑定点击事件,而当你用js动态生成一个节点并插入到dom文档结构中时,如果你 ...
- Android ListView的item点击无响应的解决方法
假设listitem里面包含button或者checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件,最经常使用的解决的方法 是在listitem的布局文件里设置des ...
- 在vue中关于element UI 中表格实现下载功能,表头添加按钮,和点击事件失效的解决办法。
因为在element 中表格是使用el-table的形式通过数据来支撑结构,所以,表格的样式没有自己写的灵活,所以有了没法添加按钮的烦恼.下面是解决的方法. 准备工作: 一.下载npm安装包两个 1. ...
随机推荐
- PayPal2019春招实习生笔试题的某一题
题目简单描述:给你n个点的坐标(x, y),均为浮点数. 如果任意两个点之间的欧几里得距离小于给定的一个浮点值,则认为这两个点之间有关联,并且关联具有传递性,总之就是尽可能扩大一个集合. 输入: d ...
- Linux命令:chmod、chgrp、chown的区别
chmod是更改文件的权限: chgrp只是更改文件的属组: chown是更改文件的属主与属组. 1.chmod:更改文件的权限 文件权限的设置方式有两种,分别是数字和标记. mode : 权限设定字 ...
- JDK 中的监控与故障处理工具-05 (jstack)
jstack : stack trace for java jstack 命令用于生成虚拟机当前时刻的线程快照 (threaddump).线程快照是当前虚拟机中每一条线程正在执行的方法堆栈的集合,生成 ...
- Vjudge - B - 这是测试你会不会排序
2017-07-14 22:44:11 writer:pprp 题目: 他们提出的比赛规则是这样的: 1. 每方派出n个人参赛: 2. 出赛的顺序必须是从弱到强(主要担心中国人擅长的田忌赛马): ...
- 使用 docker 搭建开发环境
作为一个 freelancer,经常能够接到很多的开发工作,这些金主,有喜欢 PHP 的,有习惯撒手不管的:有偏好 sqlite 的,也有喜欢 PG 的,我甚至见过 mysql.PG 一起使用的项目: ...
- 01_HBase概述
1. HBase在Hadoop生态圈中的位置 问题:HBase 是什么,用在哪里,解决什么样的问题? 解答: 1)简单来说, HBase 是一种类似于面向列的分布式数据库(集群), 底层利用HDFS ...
- 自学数据库建模工具--powerdesigner
网上找了个英文的,版本感觉有点旧12的,但还好英语还行,摸索了一下功能,大概截了几张图,感觉优点:1总共有物理模型pdm,概念模型cdm,业务模型bdm 可以互转,逻辑清晰 2表与表之前的联系,建 ...
- SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID()
``code 在SQLServer2005环境下,表的主键应该怎样设计. 目前主要用到的主键方案共三种 自动增长主键 手动增长主键 UNIQUEIDENTIFIER主键 1.先说自动增长主键,它的优点 ...
- 普通for循环遍历LinkedList弊端
java开发过程中,用到的最多的List集合就属ArrayList与LinkedList.对于ArrayList的遍历,通常是下面的方法: public static void main(String ...
- windows使用pip安装selenium报错问题
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb9 in position 7: ordinal not in range(128) 这是 ...