Android:ScrollView中的RecyclerView

时间:2016-09-01 09:18:46

标签: android scroll android-recyclerview android-scrollview

我正在尝试在ScrollView中安装RecyclerView。我的问题是,当我滚动RecyclerView时,这不是“平滑”:只要你松开手指,滚动就会立即停止。

我在片段中的布局是:

  • 滚动型
    • 的LinearLayout
      • 的TextView
      • RecyclerView
      • 按钮

我尝试禁用嵌套滚动:

mRecyclerView.setNestedScrollingEnabled(false)

并包装mRecyclerView的内容:

android:layout_height="wrap_content"

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

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

任何帮助?

1 个答案:

答案 0 :(得分:0)

这个问题在我的夜晚破坏了。 :)

观察

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

原因

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

解决方案

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

爪哇:

@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
    )
}