最近在公司项目里面发现listview里面的textview在调用settext函数的时候非常耗时,当时都有点不敢相信,这是因为如果你把textview设置成wrap_content,则每次调用settext之后会调用到
<pre name="code" class="java">........ 4033 4034 if (mMovement != null) { 4035 mMovement.initialize(this, (Spannable) text); 4036 4037 /* 4038 * Initializing the movement method will have set the 4039 * selection, so reset mSelectionMoved to keep that from 4040 * interfering with the normal on-focus selection-setting. 4041 */ 4042 if (mEditor != null) mEditor.mSelectionMoved = false; 4043 } 4044 } 4045 4046 if (mLayout != null) { 4047 //这个函数非常重要 4047 checkForRelayout(); 4048 } 4049 4050 sendOnTextChanged(text, 0, oldlen, textLength); 4051 onTextChanged(text, 0, oldlen, textLength); 4052 4053 notifyViewAccessibilityStateChangedIfNeeded(AccessibilityEvent.CONTENT_CHANGE_TYPE_TEXT); 4054 .........
6807 private void More ...checkForRelayout() { 6808 // If we have a fixed width, we can just swap in a new text layout 6809 // if the text height stays the same or if the view height is fixed. 6810 6811 if ((mLayoutParams.width != LayoutParams.WRAP_CONTENT || 6812 (mMaxWidthMode == mMinWidthMode && mMaxWidth == mMinWidth)) && 6813 (mHint == null || mHintLayout != null) && 6814 (mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight() > 0)) { 6815 // Static width, so try making a new text layout. 6816 6817 int oldht = mLayout.getHeight(); 6818 int want = mLayout.getWidth(); 6819 int hintWant = mHintLayout == null ? 0 : mHintLayout.getWidth(); 6820 6821 /* 6822 * No need to bring the text into view, since the size is not 6823 * changing (unless we do the requestLayout(), in which case it 6824 * will happen at measure). 6825 */ 6826 makeNewLayout(want, hintWant, UNKNOWN_BORING, UNKNOWN_BORING, 6827 mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight(), 6828 false); 6829 6830 if (mEllipsize != TextUtils.TruncateAt.MARQUEE) { 6831 // In a fixed-height view, so use our new text layout. 6832 if (mLayoutParams.height != LayoutParams.WRAP_CONTENT && 6833 mLayoutParams.height != LayoutParams.MATCH_PARENT) { 6834 invalidate(); 6835 return; 6836 } 6837 6838 // Dynamic height, but height has stayed the same, 6839 // so use our new text layout. 6840 if (mLayout.getHeight() == oldht && 6841 (mHintLayout == null || mHintLayout.getHeight() == oldht)) { 6842 invalidate(); 6843 return; 6844 } 6845 } 6846 6847 // We lose: the height has changed and we have a dynamic height. 6848 // Request a new view layout using our new text layout. 6849 requestLayout(); 6850 invalidate(); 6851 } else { 6852 // Dynamic width, so we have no choice but to request a new 6853 // view layout with a new text layout. 6854 nullLayouts(); 6855 requestLayout(); 6856 invalidate(); 6857 } 6858 }