2017-05-30 28 views
0
onBindViewHolder 

是一個不錯的方法,但有一個問題 - 視圖不一定是測量。那麼,如果我無法獲得View上的實際測量結果,我可以在哪裏調整TextView等內容的數量?如果ItemView與字符串長度相比具有一定的寬度,我想動態更改在Item視圖中呈現的Strings的長度。我測量了CharSet長度等。沒問題,但是如果我無法測量View的寬度,我怎麼知道它是否太長?與項目發揮出來。字符串也可以在兩個項目之間等等。所以我需要至少知道我可以訪問這種信息的位置。謝謝。RecyclerView適配器 - 佈局後可以在哪裏訪問項目視圖?

+0

或許你應該使用這樣的事情:https://github.com/ViksaaSkool/AutoFitEditText因爲,在我看來,這應該是由'EditText'不'onBindViewHolder'完成。根據文檔'onBindViewHolder' - 「由RecyclerView調用以在指定位置顯示數據。」 – xAqweRx

回答

1

您可以添加偵聽器來偵聽視圖樹中的更改,並在完成測量後獲取視圖的寬度和高度。

final ViewTreeObserver obs = mTextView.getViewTreeObserver(); 
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    @Override 
    public boolean onPreDraw() { 
     int height = mTextView.getHeight(); 
     int width = mTextView.getWidth(); 

     // Return true to proceed with the current drawing pass, or false to cancel. 
     return true; 
    } 
}); 
+0

這就是我一直在尋找的東西。有關如何減少需要調用次數的建議?每次回收者視圖裏面都會一樣嗎?它的內容是否在爲內容鋪設之後也是這種措施?像文本字符串被視爲給視圖的尺寸?唯一擔心的是它被稱爲很多次... – gitsensible

+0

@gitsensible很確定它是在佈置內容後。因爲你現在想要做的是優化,所以很難在不知道你的適配器/佈局是什麼的情況下提供答案。如果您的'ViewHolder'大部分是相同的,那麼您可能能夠在第一次調用偵聽器後緩存適配器中的寬度/高度。我建議讓你的應用程序先工作然後再決定是否需要優化它。 – Weizhi

+0

好的這裏是TextView的測量值:TV.width = 306 TV.measuredWidth = 306 contentItem.MeasuredWidth = 384 contentItem.width = 384 TheSpannable.measuredWidth = 159 – gitsensible

相關問題