最近在自己的项目中使用到了以下开源项目:

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文件作为示列,以下引自该列:

  1. <ListView
  2. android:descendantFocusability="blocksDescendants"
  3. android:focusable="false"
  4. android:divider="@drawable/leftxian1"
  5. android:id="@+id/flfg_content"
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content"
  8. />

listview item 中textview:

  1. <TextView
  2. android:focusable="true"
  3. android:padding="5dp"
  4. android:gravity="center_vertical"
  5. android:textColor="@color/black"
  6. android:id="@+id/text_law"
  7. android:layout_weight="1"
  8. android:layout_width="0dp"
  9. 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获取焦点。

他有三个常量可供设置

  1. FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理
  2. FOCUS_AFTER_DESCENDANTS 先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
  3. FOCUS_BLOCK_DESCENDANTS ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理

Setdescendantfocusability(int focusability)代码

  1. public void setDescendantFocusability(int focusability) {
  2. switch (focusability) {
  3. case FOCUS_BEFORE_DESCENDANTS:
  4. case FOCUS_AFTER_DESCENDANTS:
  5. case FOCUS_BLOCK_DESCENDANTS:
  6. break;
  7. default:
  8. throw new IllegalArgumentException("must be one of FOCUS_BEFORE_DESCENDANTS, "
  9. + "FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS");
  10. }
  11. mGroupFlags &= ~FLAG_MASK_FOCUSABILITY;
  12. mGroupFlags |= (focusability & FLAG_MASK_FOCUSABILITY);
  13. }

可以看到,只有这三个常量可以设置,不是这三个常量会抛出异常的。

设置后,会在requestFocus(int direction, Rect previouslyFocusedRect) 方法里根据设置进行相应的处理。来看下实现

Requestfocus(int direction, rect previouslyfocusedrect)代码

  1. public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
  2. if (DBG) {
  3. System.out.println(this + " ViewGroup.requestFocus direction="
  4. + direction);
  5. }
  6. int descendantFocusability = getDescendantFocusability();
  7.  
  8. switch (descendantFocusability) {
  9. case FOCUS_BLOCK_DESCENDANTS:
  10. return super.requestFocus(direction, previouslyFocusedRect);
  11. case FOCUS_BEFORE_DESCENDANTS: {
  12. final boolean took = super.requestFocus(direction, previouslyFocusedRect);
  13. return took ? took : onRequestFocusInDescendants(direction, previouslyFocusedRect);
  14. }
  15. case FOCUS_AFTER_DESCENDANTS: {
  16. final boolean took = onRequestFocusInDescendants(direction, previouslyFocusedRect);
  17. return took ? took : super.requestFocus(direction, previouslyFocusedRect);
  18. }
  19. default:
  20. throw new IllegalStateException("descendant focusability must be "
  21. + "one of FOCUS_BEFORE_DESCENDANTS, FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS "
  22. + "but is " + descendantFocusability);
  23. }
  24. }

=========================================================================

文章

https://segmentfault.com/q/1010000005800016

给出了其它的几种解决方法,个人觉得还是有可能搞定,不过由于个人客观因素所限制并没有给出具体实现验证,下面给出其中内容:

参考:
https://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)

使用PullToRefreshListView时遇到Item点击事件失效问题 解决方法的更多相关文章

  1. [转]iOS Safari 中click点击事件失效的解决办法

    iOS Safari 中click点击事件失效的解决办法 问题起因: 在微信公众号开发(微站)过程中用jquery的live方法绑定的click事件点击无效(不能执行) 问题描述 当使用委托给一个元素 ...

  2. Android ListView中Item点击事件失效解决方案

    欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...

  3. Android ListView item 点击事件失效问题的解决

    关于ListView点击无效,item无法相应点击事件的问题,网上有很多, 大致可分为俩种情况, 一种是 item中存在 ImageButton 等可以点击的组件,这会抢先获得ListView的焦点. ...

  4. iOS Safari 中click点击事件失效的解决办法

    问题起因: 在微信公众号开发(微站)过程中用jquery的live方法绑定的click事件点击无效(不能执行) 问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document  ...

  5. iOS Safari 中点击事件失效的解决办法

    问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. ...

  6. 【javascript】iOS Safari 中点击事件失效的解决办法

    问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. ...

  7. ajax局部刷新后里面的jquery事件失效的解决方法

    live() 与bind()作用基本一样. 最重要区别:live()可以将事件绑定到当前和将来的元素(eg:为id=zy元素绑定点击事件,而当你用js动态生成一个节点并插入到dom文档结构中时,如果你 ...

  8. Android ListView的item点击无响应的解决方法

    假设listitem里面包含button或者checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件,最经常使用的解决的方法 是在listitem的布局文件里设置des ...

  9. 在vue中关于element UI 中表格实现下载功能,表头添加按钮,和点击事件失效的解决办法。

    因为在element 中表格是使用el-table的形式通过数据来支撑结构,所以,表格的样式没有自己写的灵活,所以有了没法添加按钮的烦恼.下面是解决的方法. 准备工作: 一.下载npm安装包两个 1. ...

随机推荐

  1. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  2. logstash在Windows2008简单配置实例

    Windows2008 安装java1.8,配置系统环境变量: 官方下载并安装略...然后配置 logstash的配置文件 注意PATH路径名称不支持中文 input { file { type =& ...

  3. JSON and XML Serialization in ASP.NET Web API

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/json-and-xml-seri ...

  4. LeetCode——Find Minimum in Rotated Sorted Array II

    Question Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allo ...

  5. JavaScript高级程序设计-读书笔记(5)

    第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...

  6. hiho#1080 更为复杂的买卖房屋姿势 线段树+区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  7. http协议报头详解

    目录: 1. http协议简介 2. http报头举例 3. http报头详解 4. 几个字段的说明 5. 总结 6. 参考文章 1. http协议简介 HTTP是Hyper Text Transfe ...

  8. 初识HTML和CSS

    HTML 1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据库获取数据,然后替换到html文件的指定位置(W ...

  9. maven项目Java resources 上面有个红叉但是代码里面并没有什么报错

    maven项目Java resources 上面有个红叉但是代码里面并没有什么报错 解决办法: 1.通过: windows菜单  ->   show view/other 菜单  -> o ...

  10. 19.并发容器之BlockingQueue

    1. BlockingQueue简介 在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除 ...