2016-08-04 92 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.getMeasuredHeight()

背景

视图后,才返回一个有效的价值View.getHeight()它一直测量。当视图即将显示在屏幕上时,系统会自动进行测量。

当Android想要显示布局时,它将递归地调用视图树中每个视图的view.layout()函数。每个家长告诉他们的孩子他们可能有的限制(宽度/高度),并要求他们自己view.measure()。因此,该视图将在指定成员(MeasuredHeight/Width)上的约束条件下存储测量值BASED。请注意,此时view.getMeasuredHeight()将保留该值,而view.getHeight()仍然无效。 view.getHeight()只有在UI层次结构中具有实际高度时才会返回有效值。

重温

所以,要知道一个视图元素的高度,它已被测量,并通过系统布局之前,我们需要手动调用view.measure()功能。

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

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

+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();