如何在 notifyDataSetChanged 上为 recyclerView 设置动画?

How to animate recyclerView on notifyDataSetChanged?

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

我是这样实现的:

// 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))

但是只有后面的动画在播放?

我唯一能想到的是 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))

有足够的时间运行。 这是对先前答案的 link,展示了如何设置 onAnimationFinished 侦听器,该侦听器应侦听第一个动画完成。 Detect animation finish in Android's 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));