如何仅在滚动对屏幕来说太大的 RecyclerView 时才使用 MotionLayout 隐藏/显示视图?

问题描述 投票:0回答:0

我有一个

Fragment
,用于进行搜索。它的布局在顶部有一个“搜索栏”,然后有一个
TextView
和一个
RecyclerView
用于显示结果。我想在用户滚动时隐藏/显示搜索栏和
TextView
,就像在这个video中一样,但我的想法是隐藏搜索栏和
Toolbar
,而不是隐藏
TextView
。像这样的东西:

我已经在

Toolbar
中有一个自定义
activity_main.xml
必须在整个活动中固定,只有搜索栏和
TextView
需要隐藏/显示。

我尝试使用

CoordinatorLayout
让它工作,但我发现的所有示例都是显示/隐藏
Toolbar
,因此我不确定我是否可以使用
CoordinatorLayout
得到我想要的东西。

在多次尝试

CoordinatorLayout
之后,我决定寻找另一种解决方案并找到了这个。但是,它不像示例中那样工作。首先,它破坏了我的部分代码功能,其次,虽然搜索栏和
TextView
被隐藏/显示,但
RecyclerView
保持它的位置而不是取代其他两个视图:

最后,在寻找更多解决方案时,我找到了这个,它使用了

MotionLayout
。除了一个问题外,它工作得很好。当
RecyclerView
为空时,其
visibility
GONE
或者要显示的项目数可以容纳屏幕的可用空间,用户仍然可以滚动并隐藏搜索栏和
TextView
:

我不期望这种行为,我希望只有当

RecyclerView
对于屏幕来说太大时,视图才会崩溃。怎样才能做到这一点?

最近几天我一直在为此苦苦挣扎,找不到解决方案,希望您能帮助我。在下方找到 XML 文件。提前谢谢你!

活动布置:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <!-- Contenedor principal para mostrar el Toolbar y el contenido oportuno-->
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        
        <com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <!-- Toolbar que hace de ActionBar -->
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        </com.google.android.material.appbar.AppBarLayout>
        
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <!-- Menú para moverse por la app -->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/menu" />

</androidx.drawerlayout.widget.DrawerLayout>

片段布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto"
    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"
    motion:layoutDescription="@xml/motionscene"
    tools:context=".SearchFragment">

    <LinearLayout
        android:id="@+id/buscador"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/cyan"
        android:orientation="vertical"
        android:paddingBottom="16dp"
        motion:layout_constraintEnd_toEndOf="parent"
        motion:layout_constraintStart_toStartOf="parent"
        motion:layout_constraintTop_toTopOf="parent"
        motion:layout_constraintBottom_toTopOf="@id/num_resultados">

        <SearchView
            android:id="@+id/search_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:background="@drawable/search_view_background"
            android:iconifiedByDefault="false"
            android:inputType="textPersonName"
            android:queryBackground="@android:color/transparent"
            android:queryHint="Buscar..." />

        <RadioGroup
            android:id="@+id/filtro_busqueda"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/nom_futbolistico_Rb"
                style="@style/SearchRadioButton"
                android:checked="true"
                android:text="@string/nombre_futbolistico" />

            <RadioButton
                android:id="@+id/nombre_Rb"
                style="@style/SearchRadioButton"
                android:layout_marginHorizontal="16dp"
                android:text="@string/nombre" />

            <RadioButton
                android:id="@+id/apellidos_Rb"
                style="@style/SearchRadioButton"
                android:text="@string/apellidos" />
        </RadioGroup>

    </LinearLayout>

    <TextView
        android:id="@+id/num_resultados"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/recycler_view_item_search"
        android:gravity="center_horizontal"
        android:paddingVertical="8dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
        android:visibility="gone"
        motion:layout_constraintEnd_toEndOf="parent"
        motion:layout_constraintStart_toStartOf="parent"
        motion:layout_constraintTop_toBottomOf="@id/buscador" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/lista_deportistas_Rv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        motion:layout_constraintEnd_toEndOf="parent"
        motion:layout_constraintStart_toStartOf="parent"
        motion:layout_constraintBottom_toBottomOf="parent"
        motion:layout_constraintTop_toBottomOf="@id/num_resultados"
        tools:listitem="@layout/listado_deportista_item" />

</androidx.constraintlayout.motion.widget.MotionLayout>

运动场景:

<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetEnd="@id/recogido"
        motion:constraintSetStart="@id/expandido">

        <OnSwipe
            motion:dragDirection="dragUp"
            motion:moveWhenScrollAtTop="false"
            motion:touchAnchorId="@id/lista_deportistas_Rv"
            motion:touchAnchorSide="top" />

    </Transition>

    <ConstraintSet android:id="@+id/expandido">
        <Constraint android:id="@id/buscador" >
            <PropertySet android:alpha="1" />
        </Constraint>
        <Constraint android:id="@id/num_resultados">
            <PropertySet android:alpha="1"
                motion:visibilityMode="ignore"/>
        </Constraint>
        <Constraint android:id="@id/lista_deportistas_Rv">
            <PropertySet motion:visibilityMode="ignore"/>
        </Constraint>
    </ConstraintSet>

    <ConstraintSet android:id="@+id/recogido">
        <Constraint
            android:id="@id/buscador"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintBottom_toTopOf="parent">
            <PropertySet android:alpha="0" />
        </Constraint>
        <Constraint
            android:id="@id/num_resultados"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            motion:visibilityMode="ignore"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintBottom_toTopOf="parent">
            <PropertySet android:alpha="0" />
        </Constraint>
        <Constraint android:id="@id/lista_deportistas_Rv">
            <PropertySet motion:visibilityMode="ignore"/>
        </Constraint>

    </ConstraintSet>

</MotionScene>
android-recyclerview android-toolbar android-coordinatorlayout android-motionlayout android-motionscene
© www.soinside.com 2019 - 2024. All rights reserved.