2016-08-04 16 views
10

RecyclerViewのアイテムの高さはで固定されていないです。私はrecyclerviewのアイテムの高さを取得する必要があります。イメージのサイズを変更しますが、itemView.getHeight()は常にonBindViewHolderに0を返します。"onBindViewHolder"のrecyclerviewのアイテムの高さを取得する方法

私は多くの質問や記事を検索しようとしていますが、まだ解決できません。

答えて

22

ショート

手動

view.measure(
      View.MeasureSpec.makeMeasureSpec(recyclerViewWidth, View.MeasureSpec.EXACTLY), 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 

ビューを測定し、ビューは後にのみView.getHeight()に有効な値を返しますview.getMeasuredHeight()

背景

と高さを取得しますそれはそうだった測定された。測定自体は、ビューが画面に表示されようとしているときにシステムによって自動的に行われます。

Androidがレイアウトを表示したいとき、ビューツリーの各ビューに対して再帰的にview.layout()関数を呼び出します。各親は子どもに自分が持つ制約(幅/高さ)を教えて、view.measure()自身に依頼します。結果として、ビューは指定されたメンバ(MeasuredHeight/Width)の制約に計測値BASEDを格納します。この時点でview.getMeasuredHeight()は値を保持し、view.getHeight()は無効となることに注意してください。 view.getHeight()は、ビューがUI階層内の実際の高さになったら有効な値のみを返します。

要約

だから、それはシステムによって測定され、レイアウトされた前に、ビュー要素の高さを知るために、我々は手動でview.measure()機能を起動する必要があります。

measure関数は、LayoutParamsビュー+親制約のビューから派生した2つのパラメータを必要とします。

上記のコードサンプルでは、​​幅をとすると、親の幅(RecycleView)がEXACTLYになり、高さは制限されません。

+1

はいを​​初期化しているときは、測定結果を得ることができます!あなたは私にたくさんのコードを保存しました!どうも – Titmael

6

予想される高さの複数のレイアウトファイルを定義し、データセットのいくつかの基準に従ってそれらを膨張させることをお勧めします。

VH onCreateViewHolder (ViewGroup parent, 
       int viewType){ 
if(some condition){ 
//inflate layout 1 
}else{ 
//inflate layout 2 
} 

またはhere答えとして :ビューホルダー

viewHolder.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
int width = viewHolder.getMeasuredWidth(); 
int height = viewHolder.getMeasuredHeight(); 
関連する問題