从ViewPager2
_ RecyclerView
_ RecyclerView
_ ViewPager2
_下图。
父 ViewPager2 是 CoordinatorLayout 的子级,它在 RecyclerView 垂直滚动时处理折叠顶部内容。这个 ViewPager2 然后膨胀水平滚动的片段。所以我们有parent layout
:
-- CoordinatorLayout
-- FrameLayout - has appbar scrolling behavior
-- ViewPager2
-- AppBarLayout
-- CollapsingToolbarLayout
-- ImageView - background
-- Toolbar
-- ConstraintLayout - Holds title and date
父 ViewPager2 child fragments' layout
:
-- FrameLayout
-- RecyclerView
-- Pager Indicator
内容 RecyclerView 的第一行具有相同的布局:
-- FrameLayout
-- RecyclerView
-- Pager Indicator
您可以从上面的屏幕截图中看到,在第一次加载时RecyclerView
重叠AppBarLayout
是正确的行为。我在 ' 的父布局中添加了负数marginTop
以RecyclerView
实现此效果。我正在使用 a 跟踪 AppBarLayout 偏移更改,AppBarLayout.OnOffsetChangedListener
并且随着用户向上滚动,我正在减少或增加此负边距以使列表在AppBarLayout
.
我面临的问题是,如果我从列表中的第一项开始垂直滚动,那么AppBarLayout
不会触发开始折叠其内容,因此内容会过早地在AppBarLayout
. 请参阅以下屏幕截图:
我希望 AppBarLayout 内容在我启动内容 RecyclerView 滚动后立即开始向上滚动,即使它是从第一个位置启动的。似乎第一个项目RecyclerView
没有提醒AppBarLayout
开始折叠。如果我从 RecyclerView 中的其他项目开始滚动,则会观察到正确的行为。如果我从第一行向上拖动并按住,则还会观察到该错误。
我试图实现的行为的一个很好的例子是谷歌新闻应用程序,其中有一个新闻部分的标签。以下是我所期待的: