在BottomSheetDialog内的Viewpager内嵌套滚动

Sid*_* Go 7 android scroll android-fragments android-viewpager android-nestedscrollview

精简版:

如何设置NestedScrollingChildNestedScrollingParent与这些孩子的倍数。

长版

我实现了一个,BottomSheetDialogFragment它的布局包含一个ViewPager,这个 viewpager 的适配器包含一个RecyclerView.

现在,问题是,由于NestedScrollingParent此时底片的协调器布局仅支持一个direct NestedScrollingChild,因此只能嵌套滚动适配器的第一个片段。

我的意思是,无论何时setAdapter在 viewpager 上调用,第一项都支持嵌套滚动。但是在我更改页面后,新页面现在不会滚动。然后当我回到上一页时,它仍然支持滚动。

另外,我注意到如果可以滚动的片段或页面被破坏,则后续页面现在可以滚动,这意味着后面的页面成为底部页面的滚动子页面。问题是现在获得滚动能力的页面不是当前项目而是前一个(我的适配器必须维护 3 个片段)。

概括:

setAdapter

  • 片段 0 可以滚动
  • 然后将页面更改为片段 1 后,片段 1 无法滚动
  • 但是切换到片段 2,然后回到片段 1 允许片段 1 滚动(因为我猜是因为片段 0 被破坏了)

Sid*_* Go 4

在深入研究源代码后,我发现问题在于用于查找NestedScrollingChild底页的 的错误算法(Google 的人员没有考虑ViewPager底页内 a 的可能性)。

请参阅此处的方法:findScrollingChild()

此方法的作用是返回NestedScrollingChild在给定视图上遇到的第一个视图(在本例中为底页),在具有 3 个页面的视图分页器的情况下,即当前页面之前的页面。CoordinatorLayout此外,此方法会在底部表的包装器的子级的布局阶段触发。

考虑到这一点,我们可以设计出许多解决方案,包括对行为本身进行子类化。

另外,可以NestedScrollingChild通过添加和删除此类子项的一个实例(从旧页面中删除,然后添加到当前页面中)来限制 viewpager 的内部,这就是我所做的。您可以在setPrimaryItem适配器内部或在OnPageChangeListener. 请务必调用requestLayout底部表单的协调器布局。(此解决方案取决于寻呼机适配器的布局/结构类型,因此我不会发布我的确切解决方案)。