最近项目中遇到这样的一个问题:动态列表中,每个item,文字只展示120字,超过120字,就是前120字+“…”来展示。但是,文字中有表情、链接等。
以前为了省事,就直接粗暴的截取前120字,然后跟省略号。然后去匹配表情和链接等,这样,就造成了一个问题,如果截取的位置遇到了链接,就会把链接截断,造成链接的不完整。
解决的办法就是,先匹配,把链接处理完,然后再去截取
为了简单处理,我下面用50字来模拟。即:一个文本,最多展示50字,超过了就有省略号。
特别说明:上面说的所谓上限(最多50或者120字),其实是一个粗略值,是可以小范围浮动的数值。实际中没有用户会去数字数,发现字数多了去找客服反映的。
首先,我先写个基本的匹配方法,把架子搭起来。
自定义MyTextView
package com.chen.demo;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MyTextView extends TextView {
private Context mContext;
public MyTextView(Context context) {
this(context, null);
}
public MyTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
}
/**
* 处理数据
*
* @param str 要被处理的数据
*/
public void