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

如何在RecyclerView显示时禁用NestedScrollView滚动,隐藏时恢复滚动?

如何在RecyclerView显示时禁用NestedScrollView滚动,隐藏时恢复滚动?

兄弟,我先仔细看了你的问题和代码,发现几个可能导致失效的点,给你一步步分析:

第一个坑:逻辑触发时机是否正确?

先确认你的核心需求:RecyclerView显示时禁用NestedScrollView滚动,隐藏时恢复。你写的代码逻辑本身是对的,但会不会是你在错误的回调里执行了这段代码?比如是不是没把这段逻辑绑定到EditText的点击事件上?

先再明确下正确的逻辑代码,确保没写错:

// 这是EditText点击后的回调方法,用来切换RecyclerView的显示/隐藏
fun onSearchClicked() {
    if (binding.recyclerViewCities.visibility == View.VISIBLE) {
        // 隐藏RecyclerView,恢复NestedScrollView滚动
        binding.recyclerViewCities.visibility = View.GONE
        binding.nestedScrollView.isNestedScrollingEnabled = true
    } else {
        // 显示RecyclerView,禁用NestedScrollView滚动
        binding.recyclerViewCities.visibility = View.VISIBLE
        binding.nestedScrollView.isNestedScrollingEnabled = false
    }
}

第二个坑:isNestedScrollingEnabled可能不够彻底

有时候只设置isNestedScrollingEnabled = false,NestedScrollView还是会出现滚动的情况,因为触摸事件可能还是会被它接管。这时候可以用更靠谱的方法——给NestedScrollView设置触摸事件拦截:

// 在页面初始化的时候设置这个触摸监听器
binding.nestedScrollView.setOnTouchListener { _, event ->
    // 当RecyclerView可见时,拦截所有触摸事件,不让NestedScrollView处理
    binding.recyclerViewCities.visibility == View.VISIBLE
}

这样一来,只要RecyclerView显示着,NestedScrollView就完全接收不到触摸事件,自然不会滚动;当RecyclerView隐藏后,触摸事件会正常交给NestedScrollView处理,恢复滚动。

第三个坑:确保RecyclerView自身能正常滚动

你的RecyclerView高度是固定的300dp,这个设置没问题,但要确保它的isNestedScrollingEnabled属性是true(默认就是true,除非你手动改过),这样它自己才能正常滚动,不会和NestedScrollView的逻辑冲突。

你可以先试试把触摸监听器加上,再确认逻辑触发的时机是否正确,应该就能解决问题啦!

备注:内容来源于stack exchange,提问作者bhaskar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 09:44:38