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

时间:2016-08-04 10:01:52

标签: android android-recyclerview

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

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

5 个答案:

答案 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)

MyViewHolder.kt

使用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

Source