You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bottom Sheet Dialog中RecyclerView无法滚动,XML设置不生效问题

问题根源与解释

你遇到的核心问题是混淆了两个完全不同的RecyclerView:

  • 你在XML里设置nestedScrollingEnabled=false的是Fragment布局中的业务RecyclerView,但实际导致滚动异常的是ViewPager2自身内部用来管理页面切换的RecyclerView。
  • ViewPager2的底层实现本质就是一个RecyclerView(私有字段名为mRecyclerView),它默认开启了嵌套滚动。当你在Bottom Sheet Fragment中使用ViewPager2时,这个内部RecyclerView的嵌套滚动逻辑会和Bottom Sheet的滚动行为发生冲突,导致你想要的滚动效果不生效。

为什么XML设置没用?因为你改的根本不是目标对象——Fragment里的RecyclerView的嵌套滚动开关,和ViewPager2与Bottom Sheet的滚动冲突完全无关。

而你用反射修改的mRecyclerView,正是ViewPager2内部负责页面横向滚动的那个核心RecyclerView,关闭它的嵌套滚动后,就解决了和Bottom Sheet的滚动冲突问题。

补充说明

反射修改私有字段存在版本兼容性风险,Google可能在后续版本中修改这个字段的名称或实现逻辑。如果想更稳妥,可以通过自定义ViewPager2的方式实现:

class CustomViewPager2(context: Context, attrs: AttributeSet?) : ViewPager2(context, attrs) {
    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        // 获取内部RecyclerView并关闭嵌套滚动
        val recyclerView = getChildAt(0) as? RecyclerView
        recyclerView?.isNestedScrollingEnabled = false
    }
}

之后在布局中用这个自定义ViewPager2替代原生ViewPager2,同样能达到效果,且无需依赖私有字段。

内容的提问来源于stack exchange,提问作者nasibeyyubov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:17:43