Android中ListView点击事件失效的解决办法

今天的第二篇博客了,每一篇都只为了记录我所做项目中遇到的一些问题。

现在我所做的项目是这样的:我做了一个读取手机通讯记录的界面,使用了ListView控件,在ListView的item中添加了一个按钮。代码编写完成后,经过模拟器运行,发现ListView的setOnItemClickListener()方法失效。

首先我怀疑是我在增加功能时不小心删去或修改了使点击事件正常的代码,但是经过检查,发现代码正确无误。

经过查找资料,搜寻百度、博客等前辈的经验,发现了疑点。

我修改了item中的一个属性的设置。

修改之前的代码是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
<RelativeLayout/>
修改后的同一段代码是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    <span style="color:#FF0000;">android:descendantFocusability="blocksDescendants" </span>>
<RelativeLayout/>

       

         为什么会出现ListView的item点击事件的失效呢?

我在这里浅显的理解为:如果ListView的item中包含了button等同样需要点击事件监听的控件时,系统在默认情况下使item中的事件监听的控件获取焦点,使ListView失去焦点,导致无法响应setOnItemClickListener()方法。


        那么添加的这个属性是什么意思呢?

descendantFocusability属性是当一个view获取焦点时,定义viewGroup和其子控件之间的关系。该属性的值有三种:

beforeDescendants:viewGroup会优先其子控件而获取到焦点。

afterDescendants:viewGroup只有当子类控件不需要获取焦点时才获取焦点。

blocksDescendants:viewGroup会覆盖子类控件而直接获取焦点。

根据我要实现的效果,我要忽略子类控件即当前item中的button直接获取item焦点,因此我选用了第三个属性值。


在解决上述问题时参考了下面的文章,读者可以点击直接查看:

http://blog.csdn.net/caiwenfeng_for_23/article/details/37760197


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在ViewPager嵌套ListView时,可能会遇到ListView无法滑动的问题,这是因为ViewPager会拦截ListView的滑动事件。解决方法如下: 1. 自定义ListView,重写其onInterceptTouchEvent()方法,返回false,让ViewPager不拦截ListView的滑动事件。 ``` public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: setParentScrollAble(false); break; case MotionEvent.ACTION_UP: setParentScrollAble(true); break; } return super.onInterceptTouchEvent(ev); } private void setParentScrollAble(boolean flag) { getParent().requestDisallowInterceptTouchEvent(!flag); } } ``` 2. 在ViewPager的适配器,将ListView所在的布局设置为android:descendantFocusability="blocksDescendants",防止ListView获取焦点而导致ViewPager无法滑动。 ``` <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants"> <com.example.MyListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> ``` 以上两种方法都可以解决ViewPagerListView失效的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值