android maxLines ellipsize 配合使用失效,解决办法

首先,自定义一个TextView 

package com.hx.readeralliance.customView;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.text.Layout;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
import android.widget.TextView;
  
public class EllipsizingTextView extends TextView {  
    private static final String ELLIPSIS = "...";  
  
    public interface EllipsizeListener {  
        void ellipsizeStateChanged(boolean ellipsized);  
    }  
  
    private final List<EllipsizeListener> ellipsizeListeners = new ArrayList<EllipsizeListener>();  
    private boolean isEllipsized;  
    private boolean isStale;  
    private boolean programmaticChange;  
    private String fullText;  
    private int maxLines = -1;  
    private float lineSpacingMultiplier = 1.0f;  
    private float lineAdditionalVerticalPadding = 0.0f;  
  
    public EllipsizingTextView(Context context) {  
        super(context);  
    }  
  
    public EllipsizingTextView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    public EllipsizingTextView(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
    }  
  
    public void addEllipsizeListener(EllipsizeListener listener) {  
        if (listener == null) {  
            throw new NullPointerException();  
        }  
        ellipsizeListeners.add(listener);  
    }  
  
    public void removeEllipsizeListener(EllipsizeListener listener) {  
        ellipsizeListeners.remove(listener);  
    }  
  
    public boolean isEllipsized() {  
        return isEllipsized;  
    }  
  
    @Override  
    public void setMaxLines(int maxLines) {  
        super.setMaxLines(maxLines);  
        this.maxLines = maxLines;  
        isStale = true;  
    }  
  
    public int getMaxLines() {  
        return maxLines;  
    }  
  
    @Override  
    public void setLineSpacing(float add, float mult) {  
        this.lineAdditionalVerticalPadding = add;  
        this.lineSpacingMultiplier = mult;  
        super.setLineSpacing(add, mult);  
    }  
  
    @Override  
    protected void onTextChanged(CharSequence text, int start, int before, int after) {  
        super.onTextChanged(text, start, before, after);  
        if (!programmaticChange) {  
            fullText = text.toString();  
            isStale = true;  
        }  
    }  
  
    @Override  
    protected void onDraw(Canvas canvas) {  
        if (isStale) {  
            super.setEllipsize(null);  
            resetText();  
        }  
        super.onDraw(canvas);  
    }  
  
    private void resetText() {  
        int maxLines = getMaxLines();  
        String workingText = fullText;  
        boolean ellipsized = false;  
        if (maxLines != -1) {  
            Layout layout = createWorkingLayout(workingText);  
            if (layout.getLineCount() > maxLines) {  
                workingText = fullText.substring(0, layout.getLineEnd(maxLines - 1)).trim();  
                while (createWorkingLayout(workingText + ELLIPSIS).getLineCount() > maxLines) {  
                    int lastSpace = workingText.lastIndexOf(' ');  
                    if (lastSpace == -1) {  
                        break;  
                    }  
                    workingText = workingText.substring(0, lastSpace);  
                }  
                workingText = workingText + ELLIPSIS;  
                ellipsized = true;  
            }  
        }  
        if (!workingText.equals(getText())) {  
            programmaticChange = true;  
            try {  
                setText(workingText);  
            } finally {  
                programmaticChange = false;  
            }  
        }  
        isStale = false;  
        if (ellipsized != isEllipsized) {  
            isEllipsized = ellipsized;  
            for (EllipsizeListener listener : ellipsizeListeners) {  
                listener.ellipsizeStateChanged(ellipsized);  
            }  
        }  
    }  
  
    private Layout createWorkingLayout(String workingText) {  
        return new StaticLayout(workingText, getPaint(), getWidth() - getPaddingLeft() - getPaddingRight(),  
                Alignment.ALIGN_NORMAL, lineSpacingMultiplier, lineAdditionalVerticalPadding, false);  
    }  
  
    @Override  
    public void setEllipsize(TruncateAt where) {  
        // Ellipsize settings are not respected   
    }  
}  

然后,在布局文件中引用该TextView

<com.hx.readeralliance.customView.EllipsizingTextView 
          android:id="@+id/tx_attention_des"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/contentMarginBottom"
        android:layout_marginLeft="@dimen/leftPadding"
        android:layout_marginRight="@dimen/rightPadding"
        android:layout_below="@+id/articlPic"
        android:textColor="@color/index_content"
        android:textSize="@dimen/index_content"/>

最后,在代码中设置最大的行数

viewHolder.txArticleDes.setMaxLines(5);
		viewHolder.txArticleDes.setEllipsize(TextUtils.TruncateAt.valueOf("END"));


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值