LinearLayout内两个RecyclerView无法按内容自适应高度问题咨询
解决方案
核心问题原因
你当前给两个RecyclerView都设置android:layout_weight="1",相当于强制让两个控件各占父布局一半高度,所以当RecyclerView2内容较少时,底部自然会出现空白区域。
推荐方案:使用ConstraintLayout实现自适应效果
ConstraintLayout的约束高度属性可以完美满足你的需求:内容高度小于可用空间时按内容高度显示,内容超出时自动压缩到约束范围内,保证两个控件都不会被挤出屏幕。
修改后的布局代码
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv1" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/_5sdp" android:paddingStart="@dimen/_16sdp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/rv2" app:layout_constrainedHeight="true"/> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv2" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/_5sdp" android:paddingStart="@dimen/_16sdp" app:layout_constraintTop_toBottomOf="@id/rv1" app:layout_constraintBottom_toBottomOf="parent" app:layout_constrainedHeight="true"/> </androidx.constraintlayout.widget.ConstraintLayout>
属性说明
app:layout_constrainedHeight="true"是核心属性,开启后RecyclerView的高度会被上下约束限制,不会超出屏幕范围- 两个RecyclerView都设置
android:layout_height="wrap_content",内容较少时会自动适配内容高度,不会留空白 - 当两个RecyclerView的总内容高度超过屏幕高度时,系统会自动分配高度,两个控件都保持在屏幕可视范围内,内容可以独立滚动
若坚持使用LinearLayout的适配方案
如果不想更换父布局,可以通过自定义LinearLayoutManager实现高度自适应,同时限制最大高度:
- 先修改布局文件,把RecyclerView2的
layout_weight属性去掉,高度设为wrap_content,保留RecyclerView1的layout_weight="1"
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv1" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="@dimen/_5sdp" android:layout_weight="1" android:paddingStart="@dimen/_16sdp" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv2" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/_5sdp" android:paddingStart="@dimen/_16sdp" /> </LinearLayout>
- 给RecyclerView2设置自定义的LinearLayoutManager,限制最大高度为屏幕的一半:
// Kotlin 示例 val maxHeight = resources.displayMetrics.heightPixels / 2 val layoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { val params = super.generateDefaultLayoutParams() params.height = RecyclerView.LayoutParams.WRAP_CONTENT return params } override fun onMeasure(recycler: RecyclerView.Recycler, state: RecyclerView.State, widthSpec: Int, heightSpec: Int) { val newHeightSpec = View.MeasureSpec.makeMeasureSpec(maxHeight, View.MeasureSpec.AT_MOST) super.onMeasure(recycler, state, widthSpec, newHeightSpec) } } rv2.layoutManager = layoutManager
注意事项
- 你的条目布局高度是固定值40dp加上下margin,属于明确高度,RecyclerView可以正确测量内容高度,无需额外适配
- 如果后续条目高度改为动态,只需要保证条目布局的高度计算逻辑正确即可
内容的提问来源于stack exchange,提问作者Rahul Matte
相关产品推荐
相关产品推荐

