【问题标题】:Android: RecyclerView in a ScrollViewAndroid:滚动视图中的 RecyclerView
【发布时间】:2016-09-01 09:18:45
【问题描述】:

我正在尝试在 ScrollView 中有一个 RecyclerView。我的问题是,当我滚动 RecyclerView 时,这并不“流畅”:只要松开手指,滚动就会立即停止。

我在片段中的布局是:

  • 滚动视图
    • 线性布局
      • 文本视图
      • 回收站视图
      • 按钮

我尝试禁用嵌套滚动:

mRecyclerView.setNestedScrollingEnabled(false)

以及包装 mRecyclerView 的内容:

android:layout_height="wrap_content"

获得我想要的平滑滚动,但是这样 RecyclerView 的高度比它应该的要小(它不再滚动,所以我看不到一些项目)。

我目前正在使用支持库 23.4.0(我也尝试过 23.2.1,同样的问题)

有什么帮助吗?

【问题讨论】:

  • RecyclerView 已经滚动了,为什么还要放到 ScrollView 中?
  • 使用 CoordinatorLayout 而不是 ScrollView。
  • 我需要一个 ScrollView,因为我的布局中不仅有 RecyclerView。我希望 ScrollView 成为唯一可滚动的 View,但我需要 RecyclerView 来显示其所有内容
  • 您尝试使用NestedScrollView 吗?也请你提供截图!

标签: android scroll android-recyclerview android-scrollview


【解决方案1】:

这个问题毁了我的夜晚。 :)

观察

RecyclerView 在第一个屏幕上时(无需滚动即可看到),前面的视图会影响其高度。当RecyclerView 最初完全不可见时(需要向下滚动整个屏幕),它的高度是正确的。

原因

LinearLayoutScrollView 中测量其子级时,它会将剩余的像素数作为MeasureSpec 传递给模式UNSPECIFIEDRecyclerView 将此规范传递给LayoutManager,它遵循传递的高度,如果它不为空,即使它是UNSPECIFIED

解决方案

扩展RecyclerView 并覆盖RecyclerView#onMeasure,当高度测量规范为UNSPECIFIED 时,只需将零传递给super.onMeasure

Java:

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    super.onMeasure(
        widthSpec,
        MeasureSpec.getMode(heightSpec) == MeasureSpec.UNSPECIFIED ? 0 : heightSpec
    )
}

科特林:

override fun onMeasure(widthSpec: Int, heightSpec: Int) {
    super.onMeasure(
        widthSpec,
        if (MeasureSpec.getMode(heightSpec) == MeasureSpec.UNSPECIFIED) 0
        else heightSpec
    )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多