1. 程式人生 > >Android 仿微信朋友圈 Textview 全文 收起展示

Android 仿微信朋友圈 Textview 全文 收起展示

先看效果圖:

適用listview recycleview 滑動流暢,無BUG

上程式碼,直接寫在adapter裡

private final int MAX_LINE_COUNT = 3;//最大顯示行數
private final int STATE_UNKNOW = -1;//未知狀態
private final int STATE_NOT_OVERFLOW = 1;//文字行數小於最大可顯示行數
private final int STATE_COLLAPSED = 2;//摺疊狀態
private final int STATE_EXPANDED = 3;//展開狀態
private SparseArray<Integer> mTextStateList
;//儲存文字狀態集合

在繫結檢視(我用的recycleview)onBindViewHolder中

int state = mTextStateList.get(position, STATE_UNKNOW);

if (state == STATE_UNKNOW) {
    myViewHolder.homeContent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
public boolean onPreDraw() {
            //
這個回掉會呼叫多次,獲取玩行數後記得登出監聽 myViewHolder.homeContent.getViewTreeObserver().removeOnPreDrawListener(this); //如果內容顯示的行數大於限定顯示行數 if (myViewHolder.homeContent.getLineCount() > MAX_LINE_COUNT) { myViewHolder.homeContent.setMaxLines(MAX_LINE_COUNT);//設定最大顯示行數 myViewHolder.homeShowOrHide
.setVisibility(View.VISIBLE);//讓其顯示全文的文字框狀態為顯示 myViewHolder.homeShowOrHide.setText("[全文]");//設定其文字為全文 mTextStateList.put(position, STATE_COLLAPSED); } else { myViewHolder.homeShowOrHide.setVisibility(View.GONE);//顯示全文隱藏 mTextStateList.put(position, STATE_NOT_OVERFLOW);//讓其不能超過限定的行數 } return true; } }); } else { // 如果之前已經初始化過了,則使用儲存的狀態,無需在獲取一次 switch (state) { case STATE_NOT_OVERFLOW: myViewHolder.homeShowOrHide.setVisibility(View.GONE); break; case STATE_COLLAPSED: myViewHolder.homeContent.setMaxLines(MAX_LINE_COUNT); myViewHolder.homeShowOrHide.setVisibility(View.VISIBLE); myViewHolder.homeShowOrHide.setText("[全文]"); break; case STATE_EXPANDED: myViewHolder.homeContent.setMaxLines(Integer.MAX_VALUE); myViewHolder.homeShowOrHide.setVisibility(View.VISIBLE); myViewHolder.homeShowOrHide.setText("[收起]"); break; } } myViewHolder.homeShowOrHide.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int state = mTextStateList.get(position, STATE_UNKNOW); if (state == STATE_COLLAPSED) { myViewHolder.homeContent.setMaxLines(Integer.MAX_VALUE); myViewHolder.homeShowOrHide.setText("[收起]"); mTextStateList.put(position, STATE_EXPANDED); } else if (state == STATE_EXPANDED) { myViewHolder.homeContent.setMaxLines(MAX_LINE_COUNT); myViewHolder.homeShowOrHide.setText("[全文]"); mTextStateList.put(position, STATE_COLLAPSED); } } }); myViewHolder.homeContent.setText(homeInformation.getSummary());//設定資料
myViewHolder.homeContent 換成自己的TextView文字控制元件名稱就OK了
myViewHolder.homeShowOrHide是顯示[全文]或[收起] 的Textview控制元件

別忘了mTextStateList = new SparseArray<>();//需要在adapter構造方法裡new一下