如何获得“onBindViewHolder”中recyclerview项目的高度

RecyclerView项目的高度不固定 ,我需要为每个项目设置背景图像,所以我想获得recyclerview的项目的高度来调整图像的大小,但onBindViewHolder itemView.getHeight()总是在onBindViewHolder返回0。

我试图search许多问题或文章,但我仍然不能得到一个好的解决scheme。

Solutions Collecting From Web of "如何获得“onBindViewHolder”中recyclerview项目的高度"

手动测量视图

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

并通过view.getMeasuredHeight()获取高度

背景

视图只有在被测量后才会返回View.getHeight()的有效值。 当视图即将显示在屏幕上时,测量本身将自动发生。

当Android想要显示布局时,它会recursion调用视图树中每个视图的view.layout()函数。 每个父母告诉他们的孩子他们可能有的限制(宽度/高度),并要求他们自己view.measure() 。 结果,视图将根据指定成员中的约束(MeasuredHeight / Width)存储测量值。 请注意,在这一点view.getMeasuredHeight()将保持该值,而view.getHeight()仍然是无效的。 一旦视图在UI层次结构中具有实际高度, view.getHeight()将只返回有效值。

概括

因此,要知道视图元素的高度,在系统测量和布局之前,我们需要手动调用view.measure()函数。

度量函数需要2个从视图LayoutParams +父约束派生的参数。

在上面的代码示例中,我们测量的视图强制其宽度是父级(RecycleView)的宽度,并且高度不受限制。

我build议你定义多个预期高度的布局文件,并根据数据集中的一些标准对它们进行膨胀。

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

或者回答如下:您可以在初始化视图持有者的同时获得测量结果

 viewHolder.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int width = viewHolder.getMeasuredWidth(); int height = viewHolder.getMeasuredHeight();