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 ellipsizeListeners = new ArrayList();  
    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

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

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


 
  

你可能感兴趣的:(android疑难)