注:转载请注明来源!
哈哈,困扰我一周的问题终于解决了!
其实,textview自定义省略号的问题并不难解决,网上一搜就会出来一堆方法,基本都比较靠谱。
但是,我在项目中碰到的是textview与recyclerview相结合的问题,我们都知道recyclerview创建的view是复用的。
起初我给textview设置了OnGlobalLayoutListener,这个监听是在tetxview完全绘制出来之后,通过获取tetxview的linecount来设置省略号,这在一般情况下是没有问题的,但是,由于recyclerview的复用问题,导致这个监听起作用的时候,原来的view已经被其他位置的复用了,所以,你就会发现,自定义的省略号时有时无。
又尝试了复写tetxview的ondraw方法,试图在这里获取布局和linecount,可惜这里布局是null,linecount是0,又不行了。
后来又试着搜索网上有没有人类似的问题,折腾了好长时间都没有找到。
最后,经过一番研究,还是找到了一种方法,在tetxview的绘制过程中,有一个监听,可以获取到tetxview的信息。
终极代码如下:
descrip = (TextView) itemView.findViewById(R.id.descrip); //要进行自定义的tetxview
ViewTreeObserver vto = descrip.getViewTreeObserver(); //获取到观察者
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
//这里获取到绘制过程中的textview行数
int lineCount = descrip.getLineCount();
//此处根据你想设置的最大行数进行判断
if (lineCount > 2) {
int lineEndIndex = descrip.getLayout().getLineEnd(1);
//这里进行自定义省略号
String text = descrip.getText().subSequence(0, lineEndIndex - 3) + "...";
descrip.setText(text);
//达到了最大行数,停止绘制
return false;
}
return true;//还没有达到最大行数,继续绘制
}
});
ps:适用于一般情况下的解决方法
还有一种解决方法比较麻烦,我没有去实验:大概意思就是根据设备宽度和文字大小,行间距,获取高度,来计算行数
private int measureTextViewHeight(String text, int textSize, int deviceWidth) {
TextView textView = new TextView(getContext());
textView.setText(text);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(deviceWidth, MeasureSpec.AT_MOST);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
textView.measure(widthMeasureSpec, heightMeasureSpec);
return textView.getMeasuredHeight();
}