RecyclerView项目的高度不固定,我需要为每个项目设置背景图像,所以我想获得recyclerview项目的高度来调整图像的大小,但是{{1总是在itemView.getHeight()
中返回0。
我试图搜索许多问题或文章,但我仍然无法获得良好的解决方案。
答案 0 :(得分:31)
<强>短强>
手动测量视图
view.measure(
View.MeasureSpec.makeMeasureSpec(recyclerViewWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
并使用view.getMeasuredHeight()
<强>背景强>
视图只有在测量后才会返回View.getHeight()
的有效值。当视图即将在屏幕上显示时,系统将自动进行测量。
当Android想要显示布局时,它将以递归方式为视图树中的每个视图调用view.layout()
函数。每个Parent都告诉孩子他们可能有的约束(宽度/高度),并让他们自己view.measure()
。因此,视图将测量值 BASED 存储在指定成员的约束(MeasuredHeight / Width)中。请注意,此时view.getMeasuredHeight()
将保留值,而view.getHeight()
仍然无效。只有在视图在UI层次结构中具有实际高度时,view.getHeight()
才会返回有效值。
<强>小结强>
因此,要知道视图元素的高度,在系统测量和布局之前,我们需要手动调用view.measure()
函数。
measure函数需要2个参数,这些参数派生自视图LayoutParams +父约束。
在上面的代码示例中,我们测量视图强制其宽度完全父级的宽度(RecycleView),并且高度不受限制。
答案 1 :(得分:9)
我建议你定义多个具有预期高度的布局文件,并根据数据集中的某些条件对它们进行充气。
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();
答案 2 :(得分:0)
如何?
view.post(() -> {
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
答案 3 :(得分:0)
使用此代码获取回收站视图的物品高度:
view.getViewTreeObserver().addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//don't forget remove this listener
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//get item height here
int itemHeight = v.getHeight();
}
});
答案 4 :(得分:0)
使用addOnGlobalLayoutListener()
方法,可以在绘制TextView之前获得高度值。然后将其保存在成员变量中。
关键是在侦听器的实现内部和外部修改用户界面,这样就不会出现渲染问题(重新绘制视图时)。
也就是说,您应该在监听器中使用getter;侦听器内部和外部的设置器。
companion object {
var maxHeight: Int = 0
fun create(mContext: Context): MyViewHolder {
val view = LayoutInflater.from(mContext).inflate(R.layout.item_answer, null)
updateLayout(view)
view.viewTreeObserver.addOnGlobalLayoutListener {
if (view.myTextView.height > maxHeight)
maxHeight = view.myTextView.height
updateLayout(view)
}
return MyViewHolder(mContext, view).apply {
setIsRecyclable(false)
}
}
fun updateLayout(view: View) {
if (maxHeight != 0 && view.myTextView.height != maxHeight)
view.myTextView.height = maxHeight
}
}
GL