开发者社区> kk_100> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

onItemClickListener不起作用解决办法(原创)

简介: 最近写了一个项目,界面使用的是帧布局,里面放置了listview显示联系人,以及右侧有对联系人的字母索引定位。 结果在对联系人listview设置onItemClickListener时,发现竟然不起作用。
+关注继续查看

  最近写了一个项目,界面使用的是帧布局,里面放置了listview显示联系人,以及右侧有对联系人的字母索引定位。

结果在对联系人listview设置onItemClickListener时,发现竟然不起作用。

  下面的是布局文件以及设置代码

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
     android:id="@+id/contact_fl"

> <ListView android:id="@+id/contact_lv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1.0" android:focusable="true" android:focusableInTouchMode="true" android:dividerHeight="1px" android:scrollbars="none" /> <LinearLayout android:layout_width="28dp" android:layout_height="match_parent" android:layout_gravity="right|center" android:layout_marginBottom="6dp" android:layout_marginTop="10dp" android:gravity="right" android:orientation="vertical" > <ListView android:id="@+id/contact_letter" android:layout_width="28dp" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:focusable="true" android:focusableInTouchMode="true" android:scrollbars="none" /> </LinearLayout> </FrameLayout>

    在activity中设置onItemCllickListener,
代码如下:

  lv_contact.setOnItemClickListener(new OnItemClickListener()
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id)
            {
                Log.i("my", "onItemClick clicked");
                
            }
            
        });

  item的布局如下:

<ImageView 
android:scaleType="centerInside"
android:layout_marginLeft="12dp"
android:layout_marginTop="5dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="3dp"
android:layout_width="45dp"
android:layout_height="45dp"
android:src="@drawable/ic_contact_picture"
android:id="@+id/contact_contactinfoitem_iv_photo"
/> 
  
<TextView  
android:singleLine="true"
android:ellipsize="marquee"
android:textStyle="bold"
android:marqueeRepeatLimit="marquee_forever"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_weight="1.0"
android:id="@+id/contact_contactinfoitem_tv_name"
android:text="xxx"
/> 
<TextView  
android:singleLine="true"
android:ellipsize="marquee"
android:textStyle="bold"
android:marqueeRepeatLimit="marquee_forever"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_weight="1.0"
android:id="@+id/contact_contactinfoitem_tv_phone"
android:text="xxx"
/>

 

     

 

当点击联系人listiew的时候,没有打出对应的log,非常奇怪,开始的时候还以为是设置了onTouchListener的原因,因为onTouchListener返回结果会影响是否需要继续处理屏幕事件。
   检查发现onTouchListener里面,返回结果是false,不是true,这意味着屏幕事件是继续传递处理的,不会影响到onItemClickListener的处理。

     去网上查了下发现有说  xml中有个焦点属性会影响onTouchListener,需要将其改为false

     再次检测xml文件,里面确实设置有这两个属性

android:focusable="true"
android:focusableInTouchMode="true"

这两个属性的看名字就知道到意思,
android:focusable="true"-------
       设置是否获得焦点。若有requestFocus()被调用时,后者优先处理。注意在表单中想设置某一个如EditText获取焦点,光设置这个是不行的,需要将这个EditText前面的focusable都设置为false才行。在Touch模式下获取焦点需要设置focusableInTouchMode为true

android:focusableInTouchMode="true"----

     设置在Touch模式下View是否能取得焦点。

     在xml中修改,这属性为false,运行工程,发现还是一样的onItemCllickListener不起作用,这就纠结了。

  因为赶时间,干脆在adapter中,写item的onclicklistener算了。代码如下:

  

contact_fl.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View view)
            {
                Log.i("my", "onClick clicked");
                
            }
            
        });

 

       运行项目,item的点击效果有了。但是同时有新的问题出现了。在我的ontouchListener种,onkeydown事件消失了。。。。

只有onkeymove和onkeyup。

    经过分析得出结论,那就是肯定有方法或者属性,设置的时候冲突了,item的布局文件中没有button之类的空间。重点查看是否有方法或者属性使得click事件消失了

     再次到adapter中仔细检查,发现有个两个这样的方法:

@Override
    public boolean areAllItemsEnabled()
    {
        // all items are separator
        return false;
    }

    @Override
    public boolean isEnabled(int position)
    {
        // all items are separator
        return false;
    }

    查看说明:

      Returns true if the item at the specified position is not a separator. (A separator is a non-selectable, non-clickable item). The result is unspecified if position is invalid. An ArrayIndexOutOfBoundsException should be thrown in that case for fast failure.

    意思就是说,如果当前指定的位置不是一个separator--分隔符(分隔符是一个不能选中,不能点击的item),那么返回true。

    那么赶紧改为true,运行项目,效果都有了。

  成功解决。

  

 

 

 

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
行动策略过于复杂怎么办?试试下面一些解决方法
随着使用SLS告警越来越深入,有些用户的行动策略会配置的特别复杂,有些时候可以让用户通过创建多个行动策略来进行一定的精简,但是在一些场景下,用户是无法创建多个行动策略的。
0 0
“此图片来自微信公众平台 未经允许不可引用“ 解决办法
“此图片来自微信公众平台 未经允许不可引用“ 解决办法
0 0
Pycharm里面的一些超级好用的功能——(TODO注释)用法防遗忘大法
Pycharm里面的一些超级好用的功能——(TODO注释)用法防遗忘大法
0 0
布局的诡异bug合集+解决方法(更新中)
1.元素内部子元素的margin的边界线基准点的问题 论如何生硬起名字!!我反正已经被自己总结的题目绕晕了。。。 “演员”介绍: 外层父元素:蓝色边框; 内部子元素:绿色区域; 粉红色区域是元素内部绿色子元素的margin外边距; 问题说明: 就像上边这样,左边就是bug图,蓝色父元素里边的标签的border的外边距边线以父元素的padding内边线为准了。
742 0
停用两个模块并发现一个奇怪的注释问题
停用了精选车市与汽车服务两个一直没弄好的板块,使用的是html的标签,段落特征为今天的日期20150102,但奇怪的是,使用完整标签竟然整段注释后会在前台显示-->字符,反而只使用前半段可以很好的注释掉,具体原因还在查找中。
429 0
onItemClickListener不起作用解决办法2(原创)
写这边文章之前,犹豫再三,不知道会不会冒犯一位朋友,他给我之前的一篇文章提出的意见。但我声明真心无意,只是想把问题拿出来分析一下,希望获得理解。      listview在android开发中很地方都用到了,通常我们需要定制item里面的视图,就要重写adapter。
773 0
onItemClickListener不起作用解决办法(原创)
最近写了一个项目,界面使用的是帧布局,里面放置了listview显示联系人,以及右侧有对联系人的字母索引定位。 结果在对联系人listview设置onItemClickListener时,发现竟然不起作用。
652 0
【原创】关于环境变量修改出错解决办法
今天闲的无事在网上查了一些资料就是关于jdk安装后到底哪些变量是必须加的,哪些是可加可不加的,结果找到这篇文章说是这三项必须加,如下图: 当是抱着试试的心理,照着加到root用户下的.
521 0
+关注
kk_100
移动开发专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载