分类

链接

2017 年 11 月
 12345
6789101112
13141516171819
20212223242526
27282930  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > Android > 正文
共享办公室出租
解决listView中textview超链接导致listitem点击事件失效问题
Android 暂无评论 阅读(738)

ListView的Item里的TextView设置ClickableSpan和LinkMovementMethod导致ListView无法响应点击事件

  1.  CharSequence charSequence;
  2.         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
  3.             charSequence = Html.fromHtml(data.getContent(), Html.FROM_HTML_MODE_LEGACY);
  4.         } else {
  5.             charSequence = Html.fromHtml(data.getContent());
  6.         }
  7.         this.content.setText(charSequence);
  8.         //this.content.setMovementMethod(LinkMovementMethod.getInstance());
  9.  
  10.         this.content.setOnTouchListener(onTextTouch);
  11.         //this.content.setFocusable(false);

 

注意:要注释 setMovementMethod 才行

 

  1. 主要代码:
  2.  
  3.  
  4.  
  5. @Override
  6.  
  7. public View getView(int position, View convertView, ViewGroup parent) {
  8.  
  9. // TODO Auto-generated method stub
  10.  
  11. ViewHolder holder;
  12.  
  13. if (convertView==null) {
  14.  
  15. holder = new ViewHolder();
  16.  
  17. convertView = View.inflate(context, R.layout.list_item, null);
  18.  
  19. holder.mtext = (TextView) convertView.findViewById(R.id.linktest);
  20.  
  21. convertView.setTag(holder);
  22.  
  23. }else{
  24.  
  25. holder = (ViewHolder) convertView.getTag();
  26.  
  27. }
  28.  
  29. ((ViewGroup)convertView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);//加上次属性使焦点能够传递
  30.  
  31. Spanned html = Html.fromHtml(list.get(position));
  32.  
  33. Object[] spans = html.getSpans(0, html.length(), URLSpan.class);
  34.  
  35. holder.mtext.setAutoLinkMask(Linkify.WEB_URLS);
  36.  
  37. holder.mtext.setMovementMethod(LinkMovementMethod.getInstance());
  38.  
  39. holder.mtext.setText(html);
  40.  
  41. SpannableString ss = (SpannableString) holder.mtext.getText();
  42.  
  43. for (int i = 0; i < spans.length; i++) {
  44.  
  45. URLSpan span = (URLSpan) spans[i];
  46.  
  47. int end = html.getSpanEnd(span);
  48.  
  49. int start = html.getSpanStart(span);
  50.  
  51. ss.setSpan(span, start, end, 0);
  52.  
  53. }
  54.  
  55. holder.mtext.setOnTouchListener(new OnTouchListener() {
  56.  
  57. @Override
  58.  
  59. public boolean onTouch(View v, MotionEvent event) {
  60.  
  61. // TODO Auto-generated method stub
  62.  
  63. boolean ret = false;
  64.  
  65. CharSequence text = ((TextView) v).getText();
  66.  
  67. Spannable stext = Spannable.Factory.getInstance().newSpannable(text);
  68.  
  69. TextView widget = (TextView) v;
  70.  
  71. int action = event.getAction();
  72.  
  73. if (action == MotionEvent.ACTION_UP ||
  74.  
  75. action == MotionEvent.ACTION_DOWN) {
  76.  
  77. int x = (int) event.getX();
  78.  
  79. int y = (int) event.getY();
  80.  
  81. -= widget.getTotalPaddingLeft();
  82.  
  83. -= widget.getTotalPaddingTop();
  84.  
  85. += widget.getScrollX();
  86.  
  87. += widget.getScrollY();
  88.  
  89. Layout layout = widget.getLayout();
  90.  
  91. int line = layout.getLineForVertical(y);
  92.  
  93. int off = layout.getOffsetForHorizontal(line, x);
  94.  
  95. ClickableSpan[] link = stext.getSpans(off, off, ClickableSpan.class);
  96.  
  97. if (link.length != 0) {
  98.  
  99. if (action == MotionEvent.ACTION_UP) {
  100.  
  101. link[0].onClick(widget);
  102.  
  103. }
  104.  
  105. ret = true;
  106.  
  107. }
  108.  
  109. }
  110.  
  111. return ret;
  112.  
  113. }
  114.  
  115. });
  116.  
  117. return convertView;
  118.  
  119. }
  120.  
  121.  
  122.  
  123.  
  124.  

参考:ListView: TextView with LinkMovementMethod makes list item unclickable?

 

 

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:解决listView中textview超链接导致listitem点击事件失效问题 | Bruce's Blog

发表评论

留言无头像?