如何在"onBindViewHolder"中获取recyclerview项目的高度

zys*_*zys 19 android kotlin android-recyclerview

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

我试着搜索很多问题或文章,但我仍然无法获得良好的解决方案.

Eya*_*ran 33

短

手动测量视图

view.measure(
             View.MeasureSpec.makeMeasureSpec(recyclerViewWidth, View.MeasureSpec.EXACTLY),
             View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
Run Code Online (Sandbox Code Playgroud)

并获得高度 view.getMeasuredHeight()

背景

视图View.getHeight()仅在测量后才返回有效值.当视图即将在屏幕上显示时,系统将自动进行测量.

当Android想要显示布局时,它将以递归方式view.layout()为视图树中的每个视图调用该函数.每个父母都告诉孩子他们可能有的约束(宽度/高度),然后问他们view.measure()自己.其结果是,该视图将存储的测量值基于在指定部件(是measuredHeight /宽度)的限制.请注意,此时view.getMeasuredHeight()将保留该值,但view.getHeight()仍然无效.view.getHeight()只有在视图在UI层次结构中具有实际高度时,才会返回有效值.

概括

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

measure函数需要2个参数,这些参数派生自视图LayoutParams +父约束.

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

  • 你怎么知道`onBindViewHolder`中的`recyclerViewWidth`? (18认同)

Min*_*amy 11

我建议您使用预期的高度定义多个布局文件,并根据数据集中的某些条件对它们进行充气.

ViewHolder onCreateViewHolder (ViewGroup parent, int viewType){
  if(some condition){
    //inflate layout 1
  }else{
    //inflate layout 2
 }
Run Code Online (Sandbox Code Playgroud)

或者在这里回答:您可以在初始化视图持有者时获得测量结果

itemView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int width = itemView.getMeasuredWidth();
int height = itemView.getMeasuredHeight();
Run Code Online (Sandbox Code Playgroud)

  • 他可能是指 viewholder.itemView (2认同)

小智 6

这个怎么样:

view.post(() -> {
   int width = view.getMeasuredWidth();
   int height = view.getMeasuredHeight();
}
Run Code Online (Sandbox Code Playgroud)