TextView Recyclerview省略号相关

注:转载请注明来源!

 哈哈,困扰我一周的问题终于解决了!

 其实,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();

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值