具有 CollapsingToolbarLayout 的垂直 Recyclerview 中的水平滚动 Recyclerview

Mar*_* RS 5 android-recyclerview android-collapsingtoolbarlayout android-appbarlayout android-viewpager2

我正在构建一个应用程序,它使用 来ViewPager2水平滚动页面,每个页面都有一个垂直滚动的内容RecyclerView,其中每个列表的第一个位置都有一行带有水平滚动小部件(例如另一个)RecyclerViewViewPager2附加到寻呼机指示器类型小部件,如从下图。

父 ViewPager2 是 CoordinatorLayout 的子级,当 RecyclerView 垂直滚动时,它会处理折叠顶部内容。然后,此 ViewPager2 会膨胀水平滚动的片段。所以我们有parent layout

-- CoordinatorLayout 
   -- FrameLayout - has appbar scrolling behavior 
      -- ViewPager2
   -- AppBarLayout
      -- CollapsingToolbarLayout
         -- ImageView - background
         -- Toolbar
         -- ConstraintLayout - Holds title and date
Run Code Online (Sandbox Code Playgroud)

父 ViewPager2 child fragments' layout

-- FrameLayout
   -- RecyclerView
   -- Pager Indicator 
Run Code Online (Sandbox Code Playgroud)

RecyclerView 内容的第一行具有相同的布局:

-- FrameLayout
   -- RecyclerView
   -- Pager Indicator 
Run Code Online (Sandbox Code Playgroud)

展开状态

您可以从上面的屏幕截图中看到,第一次加载时RecyclerView重叠,AppBarLayout这是正确的行为。marginTop我向的父布局添加了 negativeRecyclerView来达到这种效果。我正在跟踪 AppBarLayout 偏移量的变化,AppBarLayout.OnOffsetChangedListener当用户向上滚动时,我会减少或增加这个负边距,以使列表在AppBarLayout.

我面临的问题是,如果我从列表中的第一项开始垂直滚动,则AppBarLayout不会触发开始折叠其内容,因此内容会过早地结束在AppBarLayout. 请看下面的截图:

RecyclerView 滚动不正确

我希望 AppBarLayout 内容在我开始内容 RecyclerView 滚动时立即开始向上滚动,即使它是从第一个位置启动的。似乎第一个项目RecyclerView没有提醒AppBarLayout开始崩溃。如果我从 RecyclerView 中的其他项目开始滚动,则会观察到正确的行为。如果我从第一行向上拖动并按住,那么也会观察到该错误。

我试图实现的行为的一个很好的例子是 Google 新闻应用程序,其中有一个新闻部分的选项卡。以下是我所期待的:

正确的垂直滚动动画

Mar*_* RS 3

事实证明,解决方案很简单。如果您有嵌套的 RecyclerView 或类似容器,那么您必须使用:

RecyclerView.setNestedScrollingEnabled(false)
Run Code Online (Sandbox Code Playgroud)