【问题标题】:Measure Recyclerview before it appears在 Recyclerview 出现之前测量它
【发布时间】:2014-10-22 22:05:57
【问题描述】:

我目前在测量 recyclerView 出现之前遇到问题。我需要 measureHeight 才能开始“展开”动画。

这是以前在我正在处理的代码中为 gridView 完成的,我正在尝试使用 GridLayoutManager 将其迁移到 RecyclerView

final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, View.MeasureSpec.AT_MOST);
mGridView.measure(widthSpec, heightSpec);
int targetHeight = mGridView.getMeasuredHeight();

它与 gridView 一起工作,但如果我在 recyclerView 上调用具有相同度量规范的度量方法,结果始终为 16777215,我认为这可能是某些东西的最大值,但我不能说是什么。

我看到一些帖子解释说,可以在屏幕上渲染视图之前通过使用以下测量规范对其进行测量:

final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);

但我为 recyclerView.getMeasuredHeight(); 得到 0。

有没有办法在 recyclerView 在屏幕上呈现之前正确测量它的高度?

谢谢。

【问题讨论】:

    标签: android android-view android-recyclerview android-viewgroup


    【解决方案1】:

    感谢 yigit post,我终于可以通过手动填充孩子的视图来计算未来的 recyclerView 高度,用:

    final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    final int heightSpec = View.MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, View.MeasureSpec.AT_MOST);
    

    最后将其测量高度乘以 gridLayoutManager 中包含的行数。希望 RecycleViews layoutManagers 的 WRAP_CONTENT 支持很快就会到来。

    【讨论】:

      【解决方案2】:

      您是否尝试在添加视图之前对其进行测量?如果是这样,那就很危险了。

      另外,遗憾的是,就 RecyclerView 而言,现有的布局管理器还不支持 WRAP_CONTENT。它们依赖于支持 match_paren 和精确尺寸的基本实现。

      如果您知道项目的高度,则可以扩展 GridLayoutManager,覆盖 onMeasure 并自己在那里测量。

      【讨论】:

      • 感谢您的回答。不支持 WRAP_CONTENT 可以解释这个问题。显然有人报告了它:code.google.com/p/android/issues/detail?id=74772&。视图是从 xml 布局文件扩展而来的,因此它被添加到视图层次结构中。不幸的是,我不知道孩子的身高,因为我有几个可以传递给 recyclerView 的适配器,它们可以显示不同的项目。我想如果我可以检索用于某个项目的布局,我可以给它充气,测量它,然后计算 gridLayoutManager 的高度。我会试试看。
      • 我看到你已经解决了这个问题。如果你需要一个通用的解决方案,你也可以让第一个测量通道占据所有空间然后请求另一个布局,在下一个测量通道中,你可以返回最后一个孩子的坐标(getDecoratedEnd(view))。如果适配器大小始终大于 0,您只需检查 onMeasure 调用中的视图数就足够了。希望我们会在即将发布的版本中实现这一点。
      • 不幸的是,当我第一次调用需要测量视图的 expand 方法时,我刚刚创建并填充了适配器。当我想要任何子视图时,recyclerview 不包含任何子视图。我想它必须至少绘制一次才能引用子视图?
      【解决方案3】:

      另见How do I make WRAP_CONTENT work on a RecyclerView

      如果您将RecyclerView 放在RelativeLayoutNestedScrollView 等容器中,您可以使用recyclerView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) 或您喜欢的其他变体获得它的度量。在测量之前最好致电post { /* measure here */ }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多