Как я могу оживить Recycler-View при смене менеджера по расположению

В дизайне моего приложения мне нужно сменить менеджер компоновки в режиме повторного просмотра с линейно-горизонтального на менеджер компоновки сетки

Мне нужно сделать этот переход плавным. Может ли кто-нибудь предложить мне, как я могу сделать это возможным.

1 ответ

Для того, чтобы оживить смену менеджера компоновки, вам нужно применить макет-анимацию к RecyclerView и для этого вам необходимо выполнить следующие шаги:

1) Создайте файл анимации предметов для анимации появления предметов

item_animation.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime">

    <translate
        android:fromYDelta="-30%"
        android:toYDelta="0%"
        android:interpolator="@android:anim/decelerate_interpolator" />

    <alpha android:fromAlpha="0"
        android:toAlpha="1"
        android:interpolator="@android:anim/decelerate_interpolator" />

    <scale
        android:fromXScale="115%"
        android:fromYScale="115%"
        android:toXScale="100%"
        android:toYScale="100%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:interpolator="@android:anim/decelerate_interpolator"
        />

</set>

2) Затем создайте XML-файл в папке anim для анимации макета и примените к нему анимацию элемента, как показано на рисунке:

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/item_animation"
    android:animationOrder="normal"
    android:delay="15%" />

3) Теперь, когда вы смените Layout Manager(скажем, с Grid на Linear layout), просто установите эту анимацию в RecyclerView, чтобы анимировать появление элементов RecyclerView:

   private void runLayoutAnimation(final RecyclerView recyclerView) {
            final Context context = recyclerView.getContext();
            final LayoutAnimationController controller =
                    AnimationUtils.loadLayoutAnimation(context, R.anim.layout_animation);

            recyclerView.setLayoutAnimation(controller);
            recyclerView.getAdapter().notifyDataSetChanged();
            recyclerView.scheduleLayoutAnimation();
}
            // Changing the layout manager followed by applying the animation
            recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
            runLayoutAnimation(recyclerView);