RecyclerView的android:maxHeight属性无效问题求助
嘿,我完全懂你的困扰——明明给RecyclerView加了android:maxHeight="280dp",却完全没效果,想让它默认自适应内容高度,超过280dp再固定高度滚动对吧?这其实是RecyclerView的测量逻辑和ConstraintLayout布局特性共同导致的小坑,我来给你拆解解决方案:
先修复布局里的基础错误
先看你贴的代码,有两个明显的语法/约束问题:
- RecyclerView的
app:layout_constraintTop_toBottomOf="@+id/line/>"引号没闭合,这会导致布局编译报错; - 顶部的
View(line)没有设置任何位置约束,它在ConstraintLayout里会处于默认位置(左上角),没有和parent的top/start/end绑定,会影响后续RecyclerView的布局。
方案一:给RecyclerView套一层容器(兼容性最好)
直接给RecyclerView设置maxHeight有时候不生效,是因为RecyclerView的wrap_content测量逻辑比较特殊,ConstraintLayout有时候无法正确识别它的高度限制。解决办法是给它套一层FrameLayout或LinearLayout,把maxHeight设置在容器上:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.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"> <!-- 先修复line的约束,让它固定在顶部 --> <View android:id="@+id/line" android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/black" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> <!-- 用FrameLayout作为容器,设置maxHeight --> <FrameLayout android:layout_width="0dp" android:layout_height="wrap_content" android:maxHeight="280dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/line"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> </FrameLayout> </android.support.constraint.ConstraintLayout>
原理很简单:容器会先根据RecyclerView的内容计算高度,当内容高度小于280dp时,容器自适应;当内容超过280dp时,容器固定高度为280dp,RecyclerView就会自动出现滚动条。
方案二:使用ConstraintLayout的layout_constrainedHeight属性(更简洁)
如果你用的是ConstraintLayout 1.1及以上版本,可以直接给RecyclerView添加app:layout_constrainedHeight="true"属性,配合wrap_content和maxHeight就能生效:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.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"> <View android:id="@+id/line" android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/black" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="0dp" android:layout_height="wrap_content" android:maxHeight="280dp" app:layout_constrainedHeight="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/line"/> </android.support.constraint.ConstraintLayout>
这个属性的作用是告诉ConstraintLayout:当View的wrap_content高度超过maxHeight时,强制把高度限制在maxHeight范围内,不用额外套容器就能实现需求。
额外注意点
确保你的RecyclerView适配器已经正确绑定数据,并且item布局的高度是合理的(比如不要给item设置match_parent高度,否则会导致RecyclerView高度异常)。
内容的提问来源于stack exchange,提问作者MaaAn13

