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

来自天天博客: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事件:

  1. package com.kanchufang.privatedoctor.util.spannableparser;
  2.  
  3. import android.text.Layout;
  4. import android.text.Selection;
  5. import android.text.Spannable;
  6. import android.text.method.LinkMovementMethod;
  7. import android.text.style.ClickableSpan;
  8. import android.view.MotionEvent;
  9. import android.widget.TextView;
  10.  
  11. /**
  12. * Author: wangjie
  13. * Email: tiantian.china.2@gmail.com
  14. * Date: 7/3/14.
  15. */
  16. public class LinkMovementClickMethod extends LinkMovementMethod{
  17.  
  18. private long lastClickTime;
  19.  
  20. private static final long CLICK_DELAY = 500l;
  21.  
  22. @Override
  23. public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
  24. int action = event.getAction();
  25.  
  26. if (action == MotionEvent.ACTION_UP ||
  27. action == MotionEvent.ACTION_DOWN) {
  28. int x = (int) event.getX();
  29. int y = (int) event.getY();
  30.  
  31. x -= widget.getTotalPaddingLeft();
  32. y -= widget.getTotalPaddingTop();
  33.  
  34. x += widget.getScrollX();
  35. y += widget.getScrollY();
  36.  
  37. Layout layout = widget.getLayout();
  38. int line = layout.getLineForVertical(y);
  39. int off = layout.getOffsetForHorizontal(line, x);
  40.  
  41. ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
  42.  
  43. if (link.length != 0) {
  44. if (action == MotionEvent.ACTION_UP) {
  45. if(System.currentTimeMillis() - lastClickTime < CLICK_DELAY){
  46. link[0].onClick(widget);
  47. }
  48. } else if (action == MotionEvent.ACTION_DOWN) {
  49. Selection.setSelection(buffer,
  50. buffer.getSpanStart(link[0]),
  51. buffer.getSpanEnd(link[0]));
  52. lastClickTime = System.currentTimeMillis();
  53. }
  54.  
  55. return true;
  56. } else {
  57. Selection.removeSelection(buffer);
  58. }
  59. }
  60. return super.onTouchEvent(widget, buffer, event);
  61. }
  62.  
  63. public static LinkMovementClickMethod getInstance(){
  64. if(null == sInstance){
  65. sInstance = new LinkMovementClickMethod();
  66. }
  67. return sInstance;
  68. }
  69.  
  70. private static LinkMovementClickMethod sInstance;
  71.  
  72. }

代码很简单,按住超过500ms,则认定为是长按,则不执行ClickableSpan的onClick

[Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题的更多相关文章

  1. Android 解决ScrollView下嵌套ListView进页面不在顶部的问题

    以下为整理: 方法1 刚开始还可以,后来再调试时就不行了. 为了解决scrollview和listview冲突  设置了listview的高度   结果进页面就不是在顶部了 . 解决方案1:Scrol ...

  2. C#中清空ListView中的数据

    我的显示数据的方式通过button按钮点击事件,当点击之后查询数据库库并将数据显示出来. 代码如下: private void button6_Click(object sender, EventAr ...

  3. android自定义dialog中点击listview的item事件关闭dialog

    import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; ...

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

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

  5. 【转】android UI进阶之实现listview中checkbox的多选与记录--不错

    原文网址:http://www.cnblogs.com/notice520/archive/2012/02/17/2355415.html 今天继续和大家分享涉及到listview的内容.在很多时候, ...

  6. android xml解析添加到listview中的问题

    一个问题不知什么原因,代码: public class OtherActivity extends ListActivity { @Override protected void onCreate(B ...

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

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

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

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

  9. android ListView中button点击事件盖掉onItemClick解决办法

    ListView 1.在android应用当中,很多时候都要用到listView,但如果ListView当中添加Button后,ListView 自己的 public void onItemClick ...

随机推荐

  1. log4net 中错误 System.Web.HttpException (0x80004005): 文件不存在

    用日志组件,Global 中配置的输出最后一个错误信息,总是出现下面的错误信息: 2014-04-01 14:35:41,757 级别:ERROR 信息:[Exception]:System.Web. ...

  2. Solr:Schema设计

    本文已挪至  http://www.zhoujingen.cn/blog/8546.html Solr将数据以结构化的方式存入系统中,存储的过程中可以对数据建立索引,这个结构的定义就是通过schema ...

  3. [SDK2.2]Windows Azure Virtual Network (2) 创建简单的Virtual Network

    <Windows Azure Platform 系列文章目录> 本章笔者将介绍如何创建一个简单的 Virtual Network. 1.首先我们登陆Windows Azure管理界面 ht ...

  4. LeetCode - 207. Course Schedule

    207. Course Schedule Problem's Link ---------------------------------------------------------------- ...

  5. Android流量控制——列表页面

    1.最简单的模式: 设计: 1.将页码值传给服务器,让服务器返回对应的页码数据 2.数据缓存:只缓存第一页数据. 好处: 1.实现简单.无脑 坏处: 1.浪费流量,如果用户一直在等某个人发送消息的话. ...

  6. javascript常用判断写法

    js验证表单大全,用JS控制表单提交 ,javascript提交表单 目录:1:js 字符串长度限制.判断字符长度 .js限制输入.限制不能输入.textarea 长度限制 2.:js判断汉字.判断是 ...

  7. Redis系列四之复制

    一.复制基本配置与演示 为了避免单点故障,Redis提供了复制功能,可以实现自动同步的过程. 1.配置 同步后的数据分为两类:一类是主数据库(master),一类是从数据库(slave).主数据库可以 ...

  8. BitCoin - BlockChain

    BitCoin 比特币, 参考: BlockChain 区块链, 参考: 参考

  9. Yii2初谈

    Yii2发布有两个月时间了,一直没有去仔细关注过. 今天在回顾PSR标准时,稍稍扫了一眼Yii2.它的命名风格还是一如既往的与Zend那种既首字母大写又还要下划线连接的很二的命名风格格格不入.其实我看 ...

  10. 快速熟悉Velocity

    果然公司用的东西跟平时学的东西不太一样,我们公司前台页面并不是我们熟悉的.html或者.jsp文件,而是很多人不知道的 .vm文件,其实只要我们理解了jsp文件,vm文件也就是一些基本语法不同而已. ...