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),并且高度不受限制.
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)
小智 6
这个怎么样:
view.post(() -> {
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25588 次 |
| 最近记录: |