ConstraintLayout中的ScrollView中的非滚动WRAP_CONTENT RecyclerView

时间:2019-02-16 05:26:26

标签: android android-layout android-recyclerview

我想记录遇到的问题和解决方案以使他人受益,并寻求有关解决方案中关键缺陷的帮助。

我想要一个RecyclerView,在布局中具有任意数量的行,并具有许多其他视图。 RecyclerView和其他View应该在可以滚动的ScrollView中,但是RecyclerView本身不应该滚动。

由于RecyclerView中的行数是未知的,并且我必须在RecyclerView的正下方有其他视图,因此我不能使用固定高度或match_parent

我遇到了一些奇怪的问题:当我更新RecyclerView数据(使用AsyncListDiffer)并且应该更新UI时,整个RecyclerView会跳到视图上方被约束在下面,直达父​​母的顶部。这不是ConstraintLayout的行为方式。

然后我能够阻止这种情况的发生,但是View下的RecyclerView会消失-一旦RecyclerView数据更新后就会出现。

解决方案:

  1. RecyclerView和其他View放在ConstraintLayout(或ScrollView)内的NestedScrollView
  2. RecyclerView的高度设置为wrap_content(并且添加app:layout_constrainedHeight="true"不会造成伤害)
  3. 确保RecyclerView中的行具有固定的高度,并且高度不为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的行,或者以编程方式完全避免RecyclerViewView添加到LinearLayout中。这些方法丑陋得多。

是否有一种解决方法,以便RecyclerView的行可以具有wrap_content的高度?

0 个答案:

没有答案