在recyclerview中使用之前手动测量布局

时间:2016-11-10 08:54:10

标签: android android-layout

我想在使用前测量一些布局的高度(在recyclerview中)。所有布局都有wrap_content大小或特定的dp设置(即不依赖于父视图)。

我做了如下功能。 它适用于纯粹的wrap_content大小的布局,并且没有任何已定义大小的布局(即所有wrap_content)

private float measureViewHeight(int resource) {
    View view = getLayoutInflater(null).inflate(resource, null);
    view.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    return (float) view.getMeasuredHeight();
}

但是如果布局包含一些定义了特定dp高度的布局,则测量返回不是不准确的。我该如何修复我的函数,以便返回正确的值?

更新 有了@shhp的答案,并且还修复了prelollipop崩溃...更新的答案将使用以下

private float measureViewHeight(int resource) {
    View view = getLayoutInflater(null).inflate(resource, null);
    view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    return (float) view.getMeasuredHeight();
}

2 个答案:

答案 0 :(得分:1)

View.measure的参数具有特殊含义,您应拨打MeasureSpec.makeMeasureSpec以获取参数。

替换

view.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

答案 1 :(得分:0)

尝试使用

view.post(new Runnable() {
        @Override
        public void run() {

        }
    });

当视图布局时,runnable将运行,并且应该给出正确的测量值。

此外,您不需要在measure方法中再次膨胀视图。你在浪费资源,这是不好的做法。