4

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是正确的行为。我在 ' 的父布局中添加了负数marginTopRecyclerView实现此效果。我正在使用 a 跟踪 AppBarLayout 偏移更改,AppBarLayout.OnOffsetChangedListener并且随着用户向上滚动,我正在减少或增加此负边距以使列表在AppBarLayout.

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

RecyclerView 滚动不正确

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

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

正确的垂直滚动动画

4

2 回答 2

2

解决方案很简单。如果您有嵌套的 RecyclerView 或类似容器,则必须使用:

RecyclerView.setNestedScrollingEnabled(false)
于 2019-09-12T18:25:10.773 回答
-1

我通读了使用 setNestedScrollingEnabled 为 false 提供的答案,这对我来说很糟糕,因为它使 recyclerview 无法回收,并且如果你有一个巨大的列表,你可能会在内存中崩溃等等。所以我会给你一个算法,让它在不混淆 coordinatorLayout 的情况下工作。

  1. 在垂直recyclerview上有一个滚动监听器,比如滚动监听器。每当滚动列表时,您都会收到一个回调,表明它正在滚动您还应该在空闲时收到回电。

  2. 现在,当垂直 recylerview 被滚动时,水平列表上的 setNestedScrollingEnabled = false 。

  3. 一旦垂直 recyclerview 空闲 setNestedScrollingEnabled = true 在水平列表上。

  4. 还最初在xml中将水平recyclerview设置为setNestedScrollingEnabled = false

摘要:本质上是在用户垂直滚动时关闭嵌套滚动。

当 coordinatorlayout 与不同方向的两个 recyclerviews 混淆时,这对 appbarlayout 非常有用。

于 2021-06-20T07:46:44.180 回答