RecyclerView внутри ConstraintLayout - Начальная позиция вверху родителя - PullRequest
1 голос
/ 24 июня 2019

Чтобы упростить задачу, у меня есть ConstraintLayout с двумя дочерними элементами: RecyclerView и Button.

. Я хочу, чтобы RecyclerView начал показываться сверху родительского элемента.Если в RecyclerView есть только несколько элементов для показа, их следует обернуть.Примерно так:

enter image description here

Но, если у RecyclerView достаточно элементов, чтобы пройти до конца экрана, он должен идти доверхняя часть Button, а не до нижней части его родителя.Например: enter image description here

Чтобы достичь этого эффекта, я попробовал следующую комбинацию:

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:id="@+id/my_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent" />


        <android.support.v7.widget.RecyclerView
            android:id="@+id/my_recycler_view"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constrainedHeight="true"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Это решение было прекрасно, когда RecyclerView имеет тольконесколько вещей, чтобы показать.В противном случае, если он должен выйти за пределы экрана, он будет идти за Button.

После изменения приведенного выше xml на (обратите внимание на строку app:layout_constraintBottom_toTopOf="@id/my_button" в RecyclerView):

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/my_button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />


    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constrainedHeight="true"
        app:layout_constraintBottom_toTopOf="@id/my_button"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Результат, который я получаю:

enter image description here

То есть RecyclerView располагается в центре между верхней частью родительского элемента и верхней частью кнопки.Это будет нормально, если в RecyclerView есть много предметов, но нет, если есть только небольшое количество предметов.

Вопрос : Можно ли заставить RecyclerView вести себя как:

  1. Независимо от количества элементов, установите его верхнее позиционирование так, чтобы оно находилось вверху его родительского элемента.

  2. Если элементов малопросто оберните содержимое до конца последнего элемента.

  3. Если имеется много элементов, разверните до верхней части Button, а не до нижней части parent

?

PS Решение следует использовать только как родительское ConstraintLayout.

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Вы можете использовать атрибут app:layout_constraintHorizontal_bias со значением 0, чтобы выровнять ваш RecyclerView с его верхним ограничением (1 будет соответствовать нижнему ограничению).Для использования этого смещения необходимо установить как верхнее, так и нижнее ограничения.С другой стороны, если нижнее ограничение не было установлено, вы не сможете предотвратить наложение RecyclerView на кнопку.Вот почему важно установить нижнее ограничение и сохранить app:layout_constrainedHeight="true", чтобы убедиться, что ограничение View's применяется, когда его высота установлена ​​на wrap_content.

Верхнее ограничение вашего RecyclerViewтакже неверно, так как его верхняя часть должна содержаться в верхней части родительской, а не в нижней части.

<?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">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/my_recycler_view"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constrainedHeight="true"
            app:layout_constraintVertical_bias="0.0"
            app:layout_constraintBottom_toTopOf="@id/my_button"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/my_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
0 голосов
/ 24 июня 2019
<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/my_button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />


    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/my_button"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
...