以下内容为原创,转载请注明:

来自天天博客: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的长按冲突的问题相关推荐

  1. android listview边框颜色,Android实现带有边框的ListView和item的方法

    本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2 ...

  2. android静态动画,LayoutAnimation给ListView中的item设置动态出场效果(实例)

    LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当它的子元素出场时都按照这个动画出场. LayoutAnimation作用于viewgroup有两种方式: 1 ...

  3. Android将联系人读取到LISTVIEW中遇到的问题!

    最近在学习Android开发,学习到ListView控件使用的时候参考了<Android应用开发揭秘>中的代码,由于该书是基于Android  2.0进行编写的,其中的部分代码到了更新的A ...

  4. android 两列菜单,【Android】实战开发之ListView同一个item显示2列的实现方法(仿2列商品列表)...

    Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用ListView,然后我们可以使用百度的自定义List ...

  5. Android 解决RecyclerView瀑布流刷新之后Item位置改变

    解决RecyclerView瀑布流刷新之后Item位置改变 为了测试RecyclerView瀑布流效果,每个Item的高度采取了随机高度,导致每次刷新的时候,重新随机出来的高度和原来的不一致,会导致I ...

  6. 如何在Android中的ListView中延迟加载图像

    我正在使用ListView显示一些图像和与这些图像相关的标题. 我正在从互联网上获取图像. 有没有一种方法可以延迟加载图像,以便在显示文本时不会锁定UI并在下载图像时显示它们? 图像总数不固定. #1 ...

  7. android UI进阶之实现listview中checkbox的多选与记录

    今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...

  8. Android 解决下拉刷新控件和ScrollVIew的滑动冲突问题。

    最近项目要实现ScrollView中嵌套广告轮播图+RecyleView卡片布局,并且RecyleView按照header和内容的排列样式,因为RecyleView的可扩展性很强,所以我毫无疑问的选择 ...

  9. Android处理ListView中的Item中的Button按钮不能点击的问题

    问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...

最新文章

  1. swing 实现电影选座系统
  2. python肘部法则 最优分类
  3. Dribbble for windows phone 8
  4. jQuery easyUI--layout布局页面
  5. c语言5的阶乘流程图_2020年,5种将死的编程语言!
  6. ubuntu系统下gedit 打开GBK字符集编码文件出现乱码问题解决办法
  7. 【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用
  8. 力扣 删除链表的倒数第N个节点
  9. C语言入门(20)——使用VC2013对C语言进行调试
  10. 柱面投影、拼接视差、球面投影
  11. webrtc视频码率计算
  12. SCCM更新卡住恢复处理方法
  13. 如何使用Etcd来完成选举
  14. HTML如何返回上一页?
  15. 英文排版系统C语言实现
  16. 1.8-20:反反复复
  17. 高通、低通、带通 三种滤波器的工作原理
  18. 看书笔记20080509
  19. [一步步学数据结构与算法 20]-哈希算法(上)
  20. 【学习记录】合并排序(归并排序)-分治法-计算机算法

热门文章

  1. mongo java aggregate_java使用spring + mongo进行Aggregation聚合查询
  2. java代码执行 打包jar_Java程序打包成jar文件包并执行的方法
  3. 控制div的大小自适应_干货 | 浅谈模糊自适应PID控制
  4. sublime怎么运行go_go语言环境搭建+sublime text3(windows环境下)
  5. 洛谷P1007 独木桥(贪心)
  6. 一维前缀和(附模板题)
  7. 关于Andrdoid编程中出现BufferQueue的“queueBuffer: fence is NULL”的一种解决方案
  8. Day1:360培训学习重点笔记(7.13)
  9. 【Qt串口调试助手】1.4 - 16进制接收/发送
  10. 通过使用阿里云+vuepress快速搭建静态个人博客网页页面