首页 > 解决方案 > 如何在 notifyDataSetChanged 上为 recyclerView 设置动画?

问题描述

我有一个 recyclerview,它是一个文件夹列表。当我单击一个项目时,该文件夹内的文件夹/文件是新列表。我想播放滑出旧列表并滑入新列表的动画。它应该看起来像进入或离开目录。

我已经这样实现了:

// rv : RecyclerView

rv.startAnimation(AnimationUtils.loadAnimation(context, R.anim.slide_out_to_left))
adapter.list = list
rv.notifyDataSetChanged()
rv.startAnimation(AnimationUtils.loadAnimation(context, R.anim.slide_in_from_right))

但是只有后面的动画才显示?

标签: androidkotlinandroid-animation

解决方案


我唯一能想到的是 notifyDataSetChanged() 非常具有破坏性,它可能在您的动画开始之前被调用。

我的建议是延迟

adapter.list = list
rv.notifyDataSetChanged()
rv.startAnimation(AnimationUtils.loadAnimation(context, R.anim.slide_in_from_right))

直到

rv.startAnimation(AnimationUtils.loadAnimation(context,R.anim.slide_out_to_left))

有足够的时间运行。这是上一个答案的链接,该链接显示了如何设置 onAnimationFinished 侦听器,该侦听器应侦听第一个动画完成。 在 Android 的 RecyclerView 中检测动画完成

Animation animation = AnimationUtils.loadAnimation(getContext(),R.anim.slide_out_to_left);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) { }
            @Override
            public void onAnimationEnd(Animation animation) {
              adapter.list = list;
              adapter.notifyDataSetChanged();
              rv.startAnimation(AnimationUtils.loadAnimation(context, R.anim.slide_in_from_right));
            }
            @Override
            public void onAnimationRepeat(Animation animation) {}
        });
rv.startAnimation(animation));

推荐阅读