如果项目太多,如何使进度条始终位于 recyclerView 下方并且不会被挤出屏幕?

How to keep progressbar always below a recyclerView and not to be squeezed out of screen if there are too many items?

我正在制作用于显示扫描的蓝牙设备的布局。这是布局:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragments.ScannedListFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_scan_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/progressBar_scan_list"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:itemCount="12"
        tools:listitem="@layout/list_item_scanned_list" />

    <ProgressBar
        android:id="@+id/progressBar_scan_list"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/recycler_view_scan_list"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

但是当列表项过多时,进度条会被挤出屏幕。像这样: demonstration1

当屏幕有足够的空间显示所有内容时,我想让进度条保持在 recyclerView 的底部 space 并且进度条可以完全显示在屏幕底部上方而无需滚动,即使有recyclerView 中的项目太多。

我试过垂直链接两个视图并用偏差打包链,但没有成功。另外,我发现为recyclerView添加app:layout_constraintHeight_max=""也可以达到类似的效果。但它似乎不是针对不同屏幕尺寸的通用解决方案。

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragments.ScannedListFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_scan_list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/progressBar_scan_list"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:itemCount="12"
        tools:listitem="@layout/list_item_scanned_list" />

    <ProgressBar
        android:id="@+id/progressBar_scan_list"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

这样它就会一直可见。将进度条底部约束为父级和回收器视图高度 0dp

通过将 ProgressBar 的底部约束到 parent 创建垂直链,然后将链样式设置为 packed 以便两个视图粘在一起,然后将垂直偏差设置为 0 以将它们对齐到 parent 的顶部。要防止 RecyclerView 将 ProgressBar 推出屏幕,请为 RecyclerView 设置 app:layout_constrainedHeight="true" 属性 - 当高度设置为 wrap_content.

时,它会强制执行约束
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragments.ScannedListFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_scan_list"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintVertical_chainStyle="packed"
        app:layout_constraintVertical_bias="0"
        app:layout_constrainedHeight="true"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/progressBar_scan_list"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:itemCount="12"
        tools:listitem="@layout/list_item_scanned_list" />

    <ProgressBar
        android:id="@+id/progressBar_scan_list"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/recycler_view_scan_list"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>