2015-12-20 48 views
0

我動態地呈現(而不是下載)顯示在RecyclerView中的項目的縮略圖。渲染應該以該項目的大小渲染這些縮略圖(所以沒有放大或縮小)。確定RecyclerView中視圖的大小

我已經試過在ImageView的調用措施()我RecyclerView .Adapter子類的onBindViewHolderonViewAttachedToWindow並在這兩種情況下,測量大小(實際尺寸)報告爲0。

所以,麻煩簡單地說,我無法弄清楚如何知道用什麼尺寸來渲染縮略圖。

我現在最好的猜測是附加一個偵聽器到getViewTreeObserver().addOnGlobalLayoutListener()並在回調中呈現縮略圖,但看起來很尷尬。這真的是唯一的方法嗎?

我找不到GridLayoutManagerRecyclerView中的任何方法,只是問「這個孩子的觀點有多大?」

感謝,

回答

3

是的,因爲最有可能的觀點沒有被測量,並奠定了在目前的onBindViewHolder測量尺寸是零。

我看到它的方式有兩種選擇。

選項1:蠻力的種類。我假設你有一個垂直滾動的網格佈局。你得到RecyclerView的寬度,你得到列的數量,除以另一個,然後得到你的圖像寬度。從那裏你可以找出身高。現在,如果您正在製作空白邊距,多列跨度或其他奇特的東西,則可能需要直接跳到下一個選項。

選項2:優雅複雜。您將需要作出特別ImageView子類,它會做兩兩件事:

  • 接收基準,以異步任務要呈現的圖像。
  • 重寫onMeasure()來執行一些特殊的邏輯。當調用onMeasure()時,寬度將是已知的,並且高度將是「任何你想要的大小」。在致電super.onMeasure()之前,您將根據圖像的高寬比將heightMeasureSpec更改爲精確的高度。然後你打電話super.onMeasure(),然後啓動你的渲染任務。渲染任務將引用您的ImageView對象,以便可以在任務完成時加載圖像。

您創建onBindViewHolder渲染任務(在那裏你會知道你想要的圖片),並將其分配給ImageView。在從onMeasure()執行任務時,您還將知道圖像所需的大小。

這個解決方案 - 雖然很靈活 - 顯然有更多的移動部件,還有更多的方法可能出錯。

後你看看這些,你會意識到有實際上是第三個選擇:

選項3只呈現在預定大小的圖像,讓ImageView規模吧。由縮放引入的任何圖像失真可能不足以保證在視圖的精確維度上渲染努力水平。

+0

選項1是良好結果和非Herculean努力的最佳交集。感謝您經過深思熟慮的建議。 – TomorrowPlusX