RecyclerView не анимируется, когда находится внутри NestedScrollView - PullRequest
0 голосов
/ 05 августа 2020

My RecyclerView не анимируется при прокрутке. Я сузил проблему до NestedScrollView, в котором находится RecyclerView. Когда RecyclerView находится за пределами NestedScrollView, он отлично анимируется. Но когда он в NestedScrollView, этого не происходит. Как я могу анимировать RecyclerView, сохраняя его в NestedScrollView?

Вот соответствующий макет:

<androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/mainToolbar">

        <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/tab_anim_appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center|top"
            android:layout_marginLeft="40dp"
            android:layout_marginRight="40dp"
            android:background="@android:color/transparent"
            app:elevation="0dp">

            <com.google.android.material.appbar.MaterialToolbar
                android:id="@+id/searchToolbar"
                style="@style/Widget.MaterialComponents.Toolbar.Primary"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center|top"
                android:background="#A106A1"
                android:elevation="2dp"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:layout_scrollFlags="scroll|enterAlways">

                <!-- dummy to catch focus -->
                <LinearLayout
                    android:layout_width="0px"
                    android:layout_height="0px"
                    android:focusable="true"
                    android:focusableInTouchMode="true" />

                <androidx.appcompat.widget.SearchView
                    android:id="@+id/searchView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="30dp"
                    android:layout_marginLeft="30dp"
                    android:layout_marginEnd="35dp"
                    android:layout_marginRight="35dp"
                    android:animateLayoutChanges="true"
                    android:layoutDirection="rtl"
                    app:iconifiedByDefault="true"
                    app:searchHintIcon="@null" />

            </com.google.android.material.appbar.MaterialToolbar>

        </com.google.android.material.appbar.AppBarLayout>

        <androidx.core.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/myRecyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingHorizontal="1dp" />

        </androidx.core.widget.NestedScrollView>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

А вот анимация, примененная в адаптере RecyclerView:

@Override        
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { //binds the data to the view

        holder.container.setAnimation(AnimationUtils.loadAnimation(holder.container.getContext(),R.anim.fade_out));
        holder.nameTextView.setText(labels[position]);
        holder.packageNameTextView.setText(packageNames[position]);
        holder.iconImageView.setImageDrawable(drawables[position]);

    }

Обновление : здесь используется CollapsingToolbarLayout вместо NestedScrollView. Как сделать так, чтобы панель инструментов прокручивалась?

<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mainToolbar">

<com.google.android.material.appbar.AppBarLayout
    android:id="@+id/tab_anim_appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center|top"
    android:layout_marginLeft="40dp"
    android:layout_marginRight="40dp"
    android:background="@android:color/transparent"
    app:elevation="0dp">

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/searchToolbar"
        style="@style/Widget.MaterialComponents.Toolbar.Primary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center|top"
        android:background="#A106A1"
        android:elevation="2dp"
        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"
        app:layout_scrollFlags="scroll">

        <!-- dummy to catch focus -->
        <LinearLayout
            android:layout_width="0px"
            android:layout_height="0px"
            android:focusable="true"
            android:focusableInTouchMode="true" />

        <androidx.appcompat.widget.SearchView
            android:id="@+id/searchView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="30dp"
            android:layout_marginLeft="30dp"
            android:layout_marginEnd="35dp"
            android:layout_marginRight="35dp"
            android:animateLayoutChanges="true"
            android:layoutDirection="rtl"
            app:iconifiedByDefault="true"
            app:searchHintIcon="@null" />

    </com.google.android.material.appbar.MaterialToolbar>

    </com.google.android.material.appbar.CollapsingToolbarLayout>

</com.google.android.material.appbar.AppBarLayout>

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/myRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="3dp"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Я проверил ваш xml и переделал. Это работает на моей стороне. Пожалуйста, измените его в соответствии с вашими требованиями к пользовательскому интерфейсу.

NB: проверьте после заполнения данных в recyclerview. Сначала может показаться, что он не работает из-за отсутствия данных о recyclerview.

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/tab_anim_appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center|top"
        android:fitsSystemWindows="true"
        android:background="@android:color/transparent"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="0dp">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:toolbarId="@+id/toolbar_scrolling">

            <LinearLayout
                android:layout_width="0px"
                android:layout_height="0px"
                android:focusable="true"
                android:focusableInTouchMode="true" />

            <androidx.appcompat.widget.SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="30dp"
                android:layout_marginLeft="30dp"
                android:layout_marginEnd="35dp"
                android:layout_marginRight="35dp"
                android:paddingLeft="16dp"
                android:paddingRight="16dp"
                android:animateLayoutChanges="true"
                android:background="@drawable/rounded_bg"
                android:layoutDirection="rtl"
                app:iconifiedByDefault="true"
                app:searchHintIcon="@null" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/myRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="3dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>


</androidx.coordinatorlayout.widget.CoordinatorLayout>

В действии:

getSupportActionBar().setBackgroundDrawable(getResources()
                .getDrawable(R.drawable.rounded_bg_action_bar));

rounded_bg_action_bar. xml

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

    <solid android:color="@android:color/holo_purple" />

    <corners android:bottomLeftRadius="20dp"
        android:bottomRightRadius="20dp" />
</shape>

округленное_бг. xml

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

    <solid android:color="@android:color/holo_purple" />

    <corners android:bottomLeftRadius="100dp"
        android:bottomRightRadius="100dp" />
</shape>
1 голос
/ 05 августа 2020

Это не лучший способ поместить RecyclerView внутри NestedScrollView. Если вы хотите сделать SearchBar выше RecyclerView, вы можете проверить this .

Вы также можете проверить this refference.

...