我想记录遇到的问题和解决方案以使他人受益,并寻求有关解决方案中关键缺陷的帮助。
我想要一个RecyclerView
,在布局中具有任意数量的行,并具有许多其他视图。 RecyclerView
和其他View
应该在可以滚动的ScrollView
中,但是RecyclerView
本身不应该滚动。
由于RecyclerView
中的行数是未知的,并且我必须在RecyclerView
的正下方有其他视图,因此我不能使用固定高度或match_parent
我遇到了一些奇怪的问题:当我更新RecyclerView
数据(使用AsyncListDiffer
)并且应该更新UI时,整个RecyclerView
会跳到视图上方被约束在下面,直达父母的顶部。这不是ConstraintLayout
的行为方式。
然后我能够阻止这种情况的发生,但是View
下的RecyclerView
会消失-一旦RecyclerView
数据更新后就会出现。
解决方案:
RecyclerView
和其他View
放在ConstraintLayout
(或ScrollView
)内的NestedScrollView
内RecyclerView
的高度设置为wrap_content
(并且添加app:layout_constrainedHeight="true"
不会造成伤害)wrap_content
在将我的头撞到墙上并尝试了一些无效的建议解决方案后,这对我很有帮助:make RecyclerView's height to "wrap_content" in Constraint layout
此解决方案非常简单。布局可以像这样:
<ScrollView
android:id="@+id/scrollView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- other Views -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/otherView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/anotherView"
/>
<!-- other Views -->
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
然后是一行的布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="?attr/listPreferredItemHeight">
<!-- other views -->
</androidx.constraintlayout.widget.ConstraintLayout>
这是问题所在:我不喜欢固定高度的行。如果其他内容需要放在那里怎么办?如果用户更改其文字大小怎么办?我更喜欢可以调整大小的灵活布局。但是,如果我这样做了,那么RecyclerView
就占据了ScrollView内部屏幕的高度,无论屏幕底下有多少行,所有下部视图都从屏幕底部移开了。
我可以想到的替代方法是使View
之外的所有其他RecyclerView
成为RecyclerView
的行,或者以编程方式完全避免RecyclerView
将View
添加到LinearLayout
中。这些方法丑陋得多。
是否有一种解决方法,以便RecyclerView
的行可以具有wrap_content
的高度?