[Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题
以下内容为原创,转载请注明:
来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3823429.html
项目中碰到一个问题,情景是这样的:
有一个ListView,每个item中有一个TextView,这个TextView实现了LongClick事件,这个TextView中又添加了ClickableSpan,实现了方法onClick。
我的需求是点击ClickableSpan,则响应ClickableSpan事件;长按ClickableSpan效果跟长按TextView应该一样,都响应TextView的LongClick事件。
然而结果是点击ClickableSpan响应正常;但是长按ClickableSpan时问题出现了:TextView的长按事件响应了,ClickableSpan点击事件也响应了!
研究了一下代码,解决方法如下:
继承LinkMovementMethod,然后重写里面的onTouchEvent方法,在里面判断,如果当前是长按的状态,则不执行ClickableSpan的onClick事件:
package com.kanchufang.privatedoctor.util.spannableparser;import android.text.Layout; import android.text.Selection; import android.text.Spannable; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.MotionEvent; import android.widget.TextView;/*** Author: wangjie* Email: tiantian.china.2@gmail.com* Date: 7/3/14.*/ public class LinkMovementClickMethod extends LinkMovementMethod{private long lastClickTime;private static final long CLICK_DELAY = 500l;@Overridepublic boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {int action = event.getAction();if (action == MotionEvent.ACTION_UP ||action == MotionEvent.ACTION_DOWN) {int x = (int) event.getX();int y = (int) event.getY();x -= widget.getTotalPaddingLeft();y -= widget.getTotalPaddingTop();x += widget.getScrollX();y += widget.getScrollY();Layout layout = widget.getLayout();int line = layout.getLineForVertical(y);int off = layout.getOffsetForHorizontal(line, x);ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);if (link.length != 0) {if (action == MotionEvent.ACTION_UP) {if(System.currentTimeMillis() - lastClickTime < CLICK_DELAY){link[0].onClick(widget);}} else if (action == MotionEvent.ACTION_DOWN) {Selection.setSelection(buffer,buffer.getSpanStart(link[0]),buffer.getSpanEnd(link[0]));lastClickTime = System.currentTimeMillis();}return true;} else {Selection.removeSelection(buffer);}}return super.onTouchEvent(widget, buffer, event);}public static LinkMovementClickMethod getInstance(){if(null == sInstance){sInstance = new LinkMovementClickMethod();}return sInstance;}private static LinkMovementClickMethod sInstance;}
代码很简单,按住超过500ms,则认定为是长按,则不执行ClickableSpan的onClick
转载于:https://www.cnblogs.com/tiantianbyconan/p/3823429.html
[Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题相关推荐
- android listview边框颜色,Android实现带有边框的ListView和item的方法
本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2 ...
- android静态动画,LayoutAnimation给ListView中的item设置动态出场效果(实例)
LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当它的子元素出场时都按照这个动画出场. LayoutAnimation作用于viewgroup有两种方式: 1 ...
- Android将联系人读取到LISTVIEW中遇到的问题!
最近在学习Android开发,学习到ListView控件使用的时候参考了<Android应用开发揭秘>中的代码,由于该书是基于Android 2.0进行编写的,其中的部分代码到了更新的A ...
- android 两列菜单,【Android】实战开发之ListView同一个item显示2列的实现方法(仿2列商品列表)...
Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用ListView,然后我们可以使用百度的自定义List ...
- Android 解决RecyclerView瀑布流刷新之后Item位置改变
解决RecyclerView瀑布流刷新之后Item位置改变 为了测试RecyclerView瀑布流效果,每个Item的高度采取了随机高度,导致每次刷新的时候,重新随机出来的高度和原来的不一致,会导致I ...
- 如何在Android中的ListView中延迟加载图像
我正在使用ListView显示一些图像和与这些图像相关的标题. 我正在从互联网上获取图像. 有没有一种方法可以延迟加载图像,以便在显示文本时不会锁定UI并在下载图像时显示它们? 图像总数不固定. #1 ...
- android UI进阶之实现listview中checkbox的多选与记录
今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...
- Android 解决下拉刷新控件和ScrollVIew的滑动冲突问题。
最近项目要实现ScrollView中嵌套广告轮播图+RecyleView卡片布局,并且RecyleView按照header和内容的排列样式,因为RecyleView的可扩展性很强,所以我毫无疑问的选择 ...
- Android处理ListView中的Item中的Button按钮不能点击的问题
问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...
最新文章
- swing 实现电影选座系统
- python肘部法则 最优分类
- Dribbble for windows phone 8
- jQuery easyUI--layout布局页面
- c语言5的阶乘流程图_2020年,5种将死的编程语言!
- ubuntu系统下gedit 打开GBK字符集编码文件出现乱码问题解决办法
- 【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用
- 力扣 删除链表的倒数第N个节点
- C语言入门(20)——使用VC2013对C语言进行调试
- 柱面投影、拼接视差、球面投影
- webrtc视频码率计算
- SCCM更新卡住恢复处理方法
- 如何使用Etcd来完成选举
- HTML如何返回上一页?
- 英文排版系统C语言实现
- 1.8-20:反反复复
- 高通、低通、带通 三种滤波器的工作原理
- 看书笔记20080509
- [一步步学数据结构与算法 20]-哈希算法(上)
- 【学习记录】合并排序(归并排序)-分治法-计算机算法
热门文章
- mongo java aggregate_java使用spring + mongo进行Aggregation聚合查询
- java代码执行 打包jar_Java程序打包成jar文件包并执行的方法
- 控制div的大小自适应_干货 | 浅谈模糊自适应PID控制
- sublime怎么运行go_go语言环境搭建+sublime text3(windows环境下)
- 洛谷P1007 独木桥(贪心)
- 一维前缀和(附模板题)
- 关于Andrdoid编程中出现BufferQueue的“queueBuffer: fence is NULL”的一种解决方案
- Day1:360培训学习重点笔记(7.13)
- 【Qt串口调试助手】1.4 - 16进制接收/发送
- 通过使用阿里云+vuepress快速搭建静态个人博客网页页面