可展开的TextView

public class ExpandableTextView extends LinearLayout implements OnClickListener {

	private static final int DEFAULT_MAX_LINE_COUNT = 3;
	private QTextView mDescriptionTitleView;
	private QTextView mDescriptionContentView;
	private QTextView mMoreInfoView;
	private static final String TAG = "ExpandableTextView";
	private InnerRunnable mRunnable;
	private boolean mFlag;
	private PluginResUtil mRes;


    private static final int COLLAPSIBLE_STATE_NONE = 0;
    
    /**
     * 收起状态
     */
    private static final int COLLAPSIBLE_STATE_SHRINKUP = 1;
    
    /**
     * 展开状态
     */
    private static final int COLLAPSIBLE_STATE_EXPAND = 2;
    private int mState;

	public ExpandableTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mRes= PluginResUtil.getInstance();
		View view=(LinearLayout) mRes.inflate(context, R.layout.layout_expandable_textview, this);
		view.setPadding(0, -1, 0, 0);
		mDescriptionTitleView = (QTextView) mRes.findView(view, R.id.description_title);
		mDescriptionContentView = (QTextView) mRes.findView(view, R.id.description_content);
		//mComplainView = (QTextView) mRes.findView(view, R.id.user_complain_report);
		mMoreInfoView = (QTextView) mRes.findView(view, R.id.more_info);
		mMoreInfoView.getPaint().setAntiAlias(true);
		mMoreInfoView.setOnClickListener(this);
		mRunnable = new InnerRunnable();

	}

	public ExpandableTextView(Context context) {
		this(context, null);
	}
	
	public void setTitle(CharSequence charSequence) {
		if (TextUtils.isEmpty(charSequence)) {
			mDescriptionTitleView.setVisibility(View.GONE);
			return ;
		}
		mDescriptionTitleView.setText(charSequence);
	}

	public void setContent(CharSequence charSequence) {
		if (TextUtils.isEmpty(charSequence)) {
			mDescriptionContentView.setVisibility(View.GONE);
			return ;
		}
		mDescriptionContentView.setText(charSequence, BufferType.NORMAL);
		mState = COLLAPSIBLE_STATE_EXPAND; 
		requestLayout();
	}
	
	

	public void setTextColor(int color) {
		mDescriptionContentView.setTextColor(color);
	}

	@Override
	public void onClick(View v) {
		mFlag = false;
		mDescriptionContentView.setEllipsize(null);
		requestLayout();
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		if (!mFlag) {
			mFlag = true;
			int lineCount = mDescriptionContentView.getLineCount();
			if (lineCount <= DEFAULT_MAX_LINE_COUNT) {
				mState = COLLAPSIBLE_STATE_NONE;
				mDescriptionContentView.setMaxLines(DEFAULT_MAX_LINE_COUNT + 1);
				// setMovementMethod会使TextView滚动,移动到展开后去设置。
				mDescriptionContentView.setMovementMethod(LinkMovementMethod.getInstance());
				mDescriptionContentView.setVisibility(View.VISIBLE);
				mMoreInfoView.setVisibility(View.GONE);	
			} else {
				post(mRunnable);
			}
		}
	}

	class InnerRunnable implements Runnable {
		@Override
		public void run() {
	            if (mState == COLLAPSIBLE_STATE_EXPAND) {
	            	mDescriptionContentView.setVisibility(View.VISIBLE);
	            	mDescriptionContentView.setMaxLines(DEFAULT_MAX_LINE_COUNT);
	            	mDescriptionContentView.setEllipsize(null);
	            	mMoreInfoView.setVisibility(View.VISIBLE);
	                mState = COLLAPSIBLE_STATE_SHRINKUP;
	            } else if (mState == COLLAPSIBLE_STATE_SHRINKUP) {
	            	mDescriptionContentView.setVisibility(View.VISIBLE);
	            	// setMovementMethod会使TextView滚动,移动到展开后去设置。
	            	mDescriptionContentView.setMovementMethod(LinkMovementMethod.getInstance());
	            	mDescriptionContentView.setMaxLines(Integer.MAX_VALUE);
	            	mDescriptionContentView.setEllipsize(null);
	            	mMoreInfoView.setVisibility(View.GONE);
	                mState = COLLAPSIBLE_STATE_EXPAND;
	            }
		}
	}
}



转载于:https://my.oschina.net/shaorongjie/blog/479513

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值