RecyclerView无法垂直滚动求助,嵌套NestedScrollView仍无效
RecyclerView垂直方向无法滚动(嵌套NestedScrollView仍无效)的解决方法
问题原因
垂直方向时,RecyclerView设为layout_height="wrap_content",外层LinearLayout同样是layout_height="wrap_content",导致RecyclerView无法正确计算可滚动的有效空间——所有item会被一次性测量,但高度被父布局限制,无法超出,因此无法触发滚动。而水平方向时,RecyclerView宽度是match_parent,item横向排列超出宽度就会触发滚动,所以功能正常。
如果嵌套了NestedScrollView仍无效,是因为RecyclerView默认开启了嵌套滚动功能,和NestedScrollView的滚动事件发生冲突,导致滚动失效。
方案一:不使用NestedScrollView,调整布局权重
修改外层LinearLayout和RecyclerView的布局参数,让RecyclerView占据父布局的剩余空间,保证有明确的可滚动范围:
<androidx.constraintlayout.widget.ConstraintLayout ... android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" <!-- 改为match_parent --> android:orientation="vertical"> <TextView .../> .... <androidx.recyclerview.widget.RecyclerView android:id="@+id/cutRv" android:layout_marginTop="20dp" android:background="@drawable/border_cards" android:layout_width="match_parent" android:layout_height="0dp" <!-- 改为0dp --> android:layout_weight="1"> <!-- 添加权重属性 --> </androidx.recyclerview.widget.RecyclerView> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
方案二:使用NestedScrollView的正确配置
如果必须嵌套NestedScrollView,需要做以下调整:
- 给NestedScrollView设置
layout_height="match_parent",确保它能占据整个可用空间 - 在代码中关闭RecyclerView的嵌套滚动功能,避免滚动事件冲突
- RecyclerView保持
layout_height="wrap_content"
布局修改:
<androidx.constraintlayout.widget.ConstraintLayout ... android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView .../> .... <androidx.recyclerview.widget.RecyclerView android:id="@+id/cutRv" android:layout_marginTop="20dp" android:background="@drawable/border_cards" android:layout_width="match_parent" android:layout_height="wrap_content"> </androidx.recyclerview.widget.RecyclerView> </LinearLayout> </androidx.core.widget.NestedScrollView> </androidx.constraintlayout.widget.ConstraintLayout>
代码补充:
val cutAdapter = HairCutAdapter(cutsArray,this) val recyclerView: RecyclerView = binding.cutRv recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) recyclerView.adapter = cutAdapter recyclerView.isNestedScrollingEnabled = false // 关闭嵌套滚动
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

