Android開發筆記——TextView 多行時 ellipsize

at_1發表於2021-09-09

1.先貼程式碼(以下程式碼是Recyclerview Adapter 片段)

class ItemViewHolder extends RecyclerView.ViewHolder {
    TextView  tv_notes;
    ItemViewHolder(View itemView) {
        super(itemView);
        tv_notes = itemView.findViewById(R.id.tv_notes);
        if (notesMaxLength == 0) {//notesMaxLength 只是個全域性變數,用於儲存結果,避免多次執行,最佳化效能
            tv_notes.setText(R.string.notes_max_length);//這個字串設定適當的長度,只要超過最大行,我這裡是"AAAA...AAA"
            tv_notes.post(new Runnable() {
                @Override
                public void run() {
                    tv_notes.getLineCount();
                    if (tv_notes.getLineCount() > 3/*因為我的TextView lines屬性為3,所以這裡判斷如果超過3行*/) {
                        notesMaxLength = tv_notes.getLayout().getLineEnd(2)/*第三行最後字元在總字串中的位置*/ 
						- 3/*三個點兒的長度*/;
                        if(SharedUtils.getNotesMaxLength(getActivity()) == 0){//這裡判斷是否第一次計算
                            notifyDataSetChanged();//你需要去重新整理RecyclerView,因為view.post會延遲載入
                        }
                        SharedUtils.saveNotesMaxLength(getActivity(), notesMaxLength);//持久化儲存,資料庫或者檔案隨便
                    }
                }
            });
        }
    }
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {
    if (viewHolder instanceof XXXHolder) {
        //Oter item UI
    } else if (viewHolder instanceof ItemViewHolder) {
        if (notesMaxLength > 0 && _data.get(position).getNote() != null && 
				_data.get(position).getNote().length() > notesMaxLength) {	    ((ItemViewHolder) viewHolder).tv_notes.setText(_data.get(position).getNote()									.substring(0, notesMaxLength));
        } else {	    ((ItemViewHolder) viewHolder).tv_notes.setText(_data.get(position).getNote());
        }
    }
}

2.因為getLineCount()方法與getWidth()類似,setText()方法是執行緒中完成的,所以直接呼叫getLineCount()方法返回0, 在view.post()中執行就是返回真正結果,因為返回結果之前UI已經重新整理,所以在得到結果後再次重新整理UI. 

這個方法不需要自定義TextView,也不需要用複雜難懂的演算法,簡單有效,稍微修改下程式碼,就可以滿足大多數需求。

原文連結:http://www.apkbus.com/blog-184446-78219.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2806258/,如需轉載,請註明出處,否則將追究法律責任。

相關文章