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

2023-05-16

     写这边文章之前,犹豫再三,不知道会不会冒犯一位朋友,他给我之前的一篇文章提出的意见。但我声明真心无意,只是想把问题拿出来分析一下,希望获得理解。

     listview在android开发中很地方都用到了,通常我们需要定制item里面的视图,就要重写adapter。而item中的控件根据需要来添加。但是如果出现了某些特定的item控件,就可能导致listview 的onItemClickListener不起作用。

    下面是一个范例,说明这种情况。

     首先还是先看代码:

  布局xml文件如下:

View Code

  item布局xml如下:

View Code

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/iv_photo"
            android:layout_width="45dp"
            android:layout_height="45dp"
           />

        <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1.0"
            android:gravity="center_vertical" >

            <TableRow>

                <TextView
                    android:id="@+id/tv_name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1.0"
                    android:ellipsize="marquee"                    android:marqueeRepeatLimit="marquee_forever"
                    android:singleLine="true"
                    android:text="xxx"
                     />
            </TableRow>

            <TableRow>

                <TextView
                    android:id="@+id/tv_phoneNum"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="marquee"
                    android:marqueeRepeatLimit="marquee_forever"
                    android:singleLine="true"
                    android:text="xxx"
                  />
            </TableRow>
        </TableLayout>

        <LinearLayout
            android:layout_width="43dp"
            android:layout_height="match_parent"
            android:gravity="left|center_vertical" >

            <ImageButton
                android:id="@+id/ib_call"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_launcher" />
        </LinearLayout>
    </LinearLayout>  

注意里面有一个ImageButton。

在activity中设置listview的onItemClickListener,需要做的事情就是当点击item的时候出现log信息,代码如下:

View Code

 listView.setOnItemClickListener(new OnItemClickListener()
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id)
            {
                // TODO Auto-generated method stub
                Log.i("mm", " onItemClick ");
                
            }
            
        });  

 

以及设置listview的onTouchListener,需要的事情只是当touch的时候MotionEvent的事件,代码如下:

View Code

 listView.setOnTouchListener(new OnTouchListener()
        {
            
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                // TODO Auto-generated method stub
                if(event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    Log.i("mm", "MotionEvent.ACTION_DOWN");
                }
                else if(event.getAction() == MotionEvent.ACTION_UP)
                {
                    Log.i("mm", "MotionEvent.ACTION_UP");
                }
                else if(event.getAction() == MotionEvent.ACTION_MOVE)
                {
                    Log.i("mm", "MotionEvent.ACTION_MOVE");
                }
                
                return false;
            }
        });  

 

在adapter中设置ImageButton的onClicklistener,需要做的事情只是打出log信息,代码如下:

View Code

holder.iv_call.setOnClickListener(new OnClickListener()
        {
             
             @Override
             public void onClick(View v)
             {
                // TODO Auto-generated method stub
                 Log.i("mm", "holder.iv_call.setOnClickListener ");
             }
       });  

 

好了,以上都做完了,接下来运行工程。出现界面以后,我们来使劲的点item位置(除了imageButton),

结果log中没有出现打印的


Log.i("mm", " onItemClick ");
接下来拖动item看看touch事件
打出log如下:

11-07 08:42:27.793: I/mm(540): MotionEvent.ACTION_MOVE
11-07 08:42:28.681: I/mm(540): MotionEvent.ACTION_MOVE
11-07 08:42:28.832: I/mm(540): MotionEvent.ACTION_MOVE
11-07 08:42:28.992: I/mm(540): MotionEvent.ACTION_UP  

 大家可以看到没有action_down事件,也就是没有了点击事件,一个完整的touch是down--move--move--up,而这里没有了,这是为什么呢?

再点击imagButton,看看打印信息:


11-07 08:44:31.131: I/mm(540): holder.iv_call.setOnClickListener   

    出现了我们期望的打印信息。

    在这里总结一下上面问题出现背景,item中有ImageButton,其余和平常使用listview一样的.当点击item时,onItemClickListener不起作用,ontouchListener中motionEvent.down消失了,事件只有点击item中的imagButton起作用。

    我们分析一下,当item出现了imageButton时,onItemClickListener不起作用,而在Touch中没有了down事件,首先说明onItemClickListener处理的和MotionEvent的down事件有关,然后问题的关键是这个down事件去了哪里呢?

    经过排查当item中有Checkable类以及Button类控件的时候,item的焦点会被子项获得,此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。从而导致onItemClickListener不起作用。

    已经得知了问题导致的原因就是因为item没有获得焦点,焦点被子项拿走了,那么怎么解决这类问题?本人认为处理的途径无非就是通过设置子项不能获得焦点,同时item要获得焦点。  

    这里采用的方法,要用到两个属性:

一:


android:focusable="false"  

这个属性的具体介绍可以i看我上一篇文章,设置的目的在于使得某个控件不能获得焦点。

二:


android:descendantFocusability="blocksDescendants"  

这个属性用来设置子项焦点的处理先后顺序。

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.

android:beforeFocusability      viewgroup在子项处理之前获得焦点

android:afterFocusability            viewGroup在子项处理之后获得焦点

android:blocksFocusability          viewGroup阻止子项获得焦点

 

上面就是说子项焦点能力,定义了viewgroup和它的子元素处理的关系,这关系是指当一个view在获得焦点的时候,值必须是下面的常量之一。

       那么,我们肯定imageButton不能获得焦点,因此添加ImageButton属性 focusable="false",同时我们希望item中子项不能获得焦点,所以要把给android:descendantFocusability="blocksDescendants"属性添加到imageButton的父元素即可,简单的做可以设置item的根节点上。

      以上作完后,我们在测试一下。

     点击item,出现以下log:


11-07 09:48:19.671: I/mm(1077): MotionEvent.ACTION_DOWN
11-07 09:48:19.751: I/mm(1077): MotionEvent.ACTION_UP
11-07 09:48:19.952: I/mm(1077):  onItemClick   

   touch事件有了,ItemClick也有有了,

    再次imageButton,出现以下log:


11-07 09:50:01.673: I/mm(1077): holder.iv_call.setOnClickListener   

    说明点击ImageBUtton也获得点击事件。    

    以上完美的解决问题了。

    总结:本次出现的onItemClickListener不能响应的原因是在item中有button类(子类)或者checkable类(子类)控件导致了item的焦点在子项的控件上,处理的办法就是将子项的控件焦点去掉,同时在item中xml设置阻止子项获得焦点的属性,即可解决尚需问题

   综述: 出现onItemClickListener不能响应,原因可能有多种,本人总结了有两种情况,一种是isEnable中返回值为false导致不能点击和选择,一种是因为item中有了checkable或者button类(子类)控件导致了item的焦点失去,从不能响应。因此需要仔细分析,问题导致的具体原因,才更好的解决问题。

    最后:感谢上一篇文章中给我给意见的同学。

   欢迎转载,但请标明出处,谢谢

 

 





 

转载于:https://www.cnblogs.com/xilinch/archive/2012/11/07/2759265.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

onItemClickListener不起作用解决办法2(原创) 的相关文章

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

    写这边文章之前 xff0c 犹豫再三 xff0c 不知道会不会冒犯一位朋友 xff0c 他给我之前的一篇文章提出的意见 但我声明真心无意 xff0c 只是想把问题拿出来分析一下 xff0c 希望获得理解 listview在android开发
  • 单击 listViewItem 时显示带有单选按钮的警报对话框

    我有一个 listView 其中有 2 个项目 这两个项目是 秒 和 分钟 当我按 秒 时 我希望打开一个警报对话框并显示 5 10 15 秒 当我按分钟时也一样 像这样的东西 但我在实施它时遇到了困难 因为我不太了解它是如何工作的 这是我
  • 如何使用 OnItemClick 从列表视图中检索单击的字符串?

    我这里有一些问题 它看起来很简单 我一直在寻找它的解决方案 不幸的是 我找不到任何东西 这是我的问题 我想做的是从项目单击方法中获取列表视图中显示的字符串 这是我的列表视图 lol hi waw 当我单击 lol 时 我想获取 lol 字符
  • 使用 AutocompleteTextView 和 onclicklistener 自定义 ArrayAdapter

    嘿伙计们 我已经编写了一个 AutocompleteTextView 并且效果很好 现在我需要在自动完成的下拉视图上使用侦听器 我已经根据需要实现了自定义 ArrayAdapter 但现在当我使用侦听器时 我得到了一个执行 IndexOut
  • 如何使用 OnItemClickListener 根据单击的项目启动新意图?

    我希望能够使用 Intent 类启动新活动 我知道如何使用以下代码行启动活动 Intent myIntent new Intent v getContext bylocationactivity class startActivityFor
  • Android 列表视图中的 OnItemClickListener 与 OnclickListener

    由于代码的原因 这会很长 所以我有一个关于 OnItemclickListener 与 OnclickListener 的问题 这里我有两个代码 每个代码都有效 所以是否有优先使用这两个代码之一或者我可以使用任何人 这是 OnItemCli
  • 当按钮位于列表中时,ListView 长按不起作用

    我有一个带有自定义列表适配器的 ListView 它有 OnItemClickListener 和 OnItemLongClickListner 它们曾经工作得很好 之后 我必须在列表项的布局中放置一个按钮 并且项目单击和长按侦听器停止工作
  • 获取GridView中视图的ID

    我尝试过的 大家好 我首先创建了一个数据库 其中填充了 3 列 行 ID 图像 ID 文本 之后我创建了一个 GridView 它填充了我的数据库 现在我创建了一个 onItemClickListner 我想在其中获取该位置的 imageI
  • onListItemClick 不适用于列表视图?

    您好 列表视图的 onListItemClick 不起作用 在这里 我使用 AsyncTask 从 SQLite 获取数据并将其显示在列表视图中 我想在单击列表视图中的列表时执行一些操作 但点击没有发生 为此我做了很多尝试 请帮我 这是我的
  • setonitemclicklistener 不适用于 gridview

    这是我的代码代码 我没有从 gridview setOnClickListener 得到任何响应 请帮帮我 setContentView R layout myfav gView GridView findViewById R id gri
  • Android:找不到处理 Intent 错误的 Activity?将如何解决

    找不到处理 Intent 错误的 Activity 将如何解决 Preference customPref Preference findPreference DataEntryScreen customPref setOnPreferen
  • view.getId() 在 OnItemClickListener 中返回错误的 id

    在我的应用程序中 我有一个包含一些图像的图库 当用户选择图像时 我想以某种方式检索所选图像的 id getId 返回的 int 为 1 为什么我无法获取所选图像的系统 ID gallery setOnItemClickListener ne
  • OnItemClick 侦听器和单击的视图项的可见性

    我有一个 ListView 其中每个项目都包含一个Textview and ImageView其中imageView is invisible通过单击每个列表视图项目 它将visible我的代码是 Override public void
  • 如何使列表视图中的项目可点击?

    我一直在尝试寻找解决方案 但收效甚微 我必须显示一个弹出窗口包含项目列表 我能够显示窗口 但是项目点击监听器单击中的项目时不会被调用列表显示 任何有关此问题的帮助将不胜感激 Thanks Edit1 public class PopUpWi
  • OnItemClickListener 使用 ArrayAdapter 用于 ListView

    我想要为使用 ArrayAdapter 创建的 ListView 提供一个 OnItemClickListener 这是我用来创建它的代码 List
  • 在android中获取列表视图项目的点击次数

    我想计算列表视图中特定项目的点击次数 假设列表视图中有 3 个项目 我第一次单击第一个项目 它应该显示第一个项目点击计数为 1 的 toast 消息 现在 如果我再次单击第一个项目 消息应该是第一个项目点击计数为 2 对于其他项目依此类推
  • 保持 GridView 中的图像处于选中状态

    我做了什么 大家好 我有一个 GrindView 我填充了我的数据库 现在图像显示在那里并且可以滚动 但是当我点击它时 它们不会保持选中状态 为了查看选择了哪张图片 我构建了一条 Toastmessage 它显示了我使用 onIemClic
  • 如何获取 ListView 项目 onItemClick 的光标值?

    我创建了一个数据库 其中包含表 类别 和列 id 标题等 我想从我的数据库中读取这些类别的数据并将它们列出在ListView 这是我的代码 public class MainActivity extends listActivity pri
  • Android编程-多个列表视图的onitemclicklistener不起作用

    在我的活动中 我创建了七个列表视图 并使用 viewpager 在同一活动中在它们之间滑动 然后我有一个 sqlite 数据库填充每个列表视图 我的问题是 onitemclicklistener 不起作用 没有错误 代码执行正常 但列表项点
  • Android:列表视图崩溃

    我正在使用 android listview 并且它工作得很好 我的实现如下 ListView listview ListView findViewById R id list setListAdapter new ArrayAdapter

随机推荐

  • Windows 文件资源管理器中搜索带特殊字符文件名的方法

    今天处理一些文件 xff0c 文件夹这包含有类似 16年普通高等学校招生全国统一考试 英语 的文件名 xff0c 想全部找出来删除掉 xff0c 直接在文件资源管理器里面输入 是搜索不到想要的文件的 xff0c 这些是特殊字符 xff0c
  • 脑成像坐标系: MNI + Talairach

    一 脑成像坐标系 xff1a MNI Talairach MNI 脑 Montreal Neurological Institute 是基于大量的正常被试MRI扫描结果得到的标准脑 xff08 当然是欧罗巴人群的 xff09 Talaira
  • windows10隐藏分区(隐藏efi系统分区)

    我们需要使用diskpart来移除这个误显示的盘符 可能使用的命令 xff1a 1 以管理员身份运行CMD xff1b 2 运行diskpart命令 xff1b 3 list disk 显示所有安装的磁盘 xff1b 4 select di
  • 干支纪年和纪日算法

    怎样从已知年份和日期得到对应的干支纪年和纪日 文 xff0f 葛民勤 摘要 xff1a 从已知年份计算干支纪年很简单 xff1a 年份数减3 xff0c 除以10的余数是天干 xff0c 除以12的余数是地 支 从已知日期计算干支纪日的公式
  • Shell 脚本监控磁盘空间

    df 命令可以展示文件系统的磁盘有效空间信息 如果不指定文件名 xff0c 则当前所有挂载的文件系统有效空间信息 实现步骤 使用 df 查看磁盘信息使用 grep命令 过滤文件系统 xff0c 获取空间使用百分比通过Shell 脚本进行监控
  • R 实现熵权法计算权重

    按照信息论基本原理的解释 xff0c 信息是系统有序程度的一个度量 xff0c 熵是系统无序程度的一个度量 xff1b 根据信息熵的定义 xff0c 对于某项指标 xff0c 可以用熵值来判断某个指标的离散程度 xff0c 其信息熵值越小
  • R实现KMeans聚类算法教程

    本文和你一起学习无监督机器学习算法 kmeans算法 xff0c 并在R中给详细的实现示例和步骤 什么是k means聚类算法 聚类是从数据集中对观测值进行聚类的机器学习方法 它的目标是聚类相似观测值 xff0c 不同类别之间差异较大 聚类
  • 使用gopsutil获取OS信息

    生产环境通常需要掌握主机硬盘 CPU 内存 进程等资源使用情况 xff0c 可以执行系统命令获得 xff0c 通过os exec执行命令 xff0c 如 xff1a ps cd top xff0c 然后解析命令执行结果 对于linux操作系
  • gcc工具小结

    关于 l和 Wall选项的解析 xff1a Wall 打开gcc的所有警告 l参数就是用来指定程序要链接的库 xff0c l参数紧接着就是库名 xff0c 那么库名跟真正的库文件名有什么关系呢 xff1f 就拿数学库来说 xff0c 他的库
  • 如何在Java中调用Python

    Python语言有丰富的系统管理 数据处理 统计类软件包 xff0c 因此从java应用中调用Python代码的需求很常见 实用 DataX 是阿里开源的一个异构数据源离线同步工具 xff0c 致力于实现包括关系型数据库 MySQL Ora
  • ClickHouse 基于角色访问控制(RBAC)最佳实践

    本文介绍ClickHouse RBAC访问控制模型 包括如何启用SQL管理 xff0c 创建管理员用户 xff0c 创建角色 xff0c 授权 xff0c 细粒度列和行级授权 并通过示例进行验证实现过程 启用RBAC 在users xml中
  • R语言中mean函数

    mean函数是求算术平均值 用法 xff1a mean x trim 61 0 na rm 61 FALSE x是数值型 逻辑向量 trim表示截尾平均数 xff0c 0 0 5之间的数值 xff0c 如 xff1a 0 10表示丢弃最大1
  • 使用Spring @DependsOn控制bean加载顺序

    使用Spring 64 DependsOn控制bean加载顺序 spring容器载入bean顺序是不确定的 xff0c spring框架没有约定特定顺序逻辑规范 但spring保证如果A依赖B 如beanA中有 64 Autowired B
  • 使用R中merge()函数合并数据

    使用R中merge 函数合并数据 在R中可以使用merge 函数去合并数据框 xff0c 其强大之处在于在两个不同的数据框中标识共同的列或行 如何使用merge 获取数据集中交叉部分 merge 最简单的形式为获取两个不同数据框中交叉部分
  • 介绍java中Pair

    介绍java中Pair 在这篇文章中 xff0c 我们讨论了一个非常有用的编程概念 xff0c 配对 Pair 配对提供了一种方便方式来处理简单的键值关联 xff0c 当我们想从方法返回两个值时特别有用 在核心Java库中可以使用配对 Pa
  • python numpy 中linspace函数

    python numpy 中linspace函数 numpy提供linspace函数 有时也称为np linspace 是python中创建数值序列工具 与Numpy arange函数类似 xff0c 生成结构与Numpy 数组类似的均匀分
  • Spring框架学习重点概要笔记(一)

    spring框架的注解实现 xff1a xff08 1 xff09 首先在spring的核心配置文件中开启注解配置 xff1a xff08 2 xff09 64 Component 目前Spring中提供了四个注解 xff0c 相当于时Co
  • 做个爱读书的程序员

    很多时候我们抱怨工作过于忙碌 xff0c 疲于应付各种事情 但是往往即使有时间也总是会无所事事地浪费掉 xff0c 我们可以找很多理由去给自己解脱 xff0c 固然是想在忙碌之外给自己放松一下 xff0c 大多却是过于可惜的时候 今天跟一个
  • xming Error: Can‘t open display:

    运行 xclock xhost 报错 xff1a xming Error Can 39 t open display 需要安装xorg x11 xauth在运行 xclock 或 xhost root 64 stone yum y inst
  • onItemClickListener不起作用解决办法2(原创)

    写这边文章之前 xff0c 犹豫再三 xff0c 不知道会不会冒犯一位朋友 xff0c 他给我之前的一篇文章提出的意见 但我声明真心无意 xff0c 只是想把问题拿出来分析一下 xff0c 希望获得理解 listview在android开发