android - 如何在 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))
但是只有后面的动画才显示?
解决方案
我唯一能想到的是 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));
推荐阅读
- mysql - 将数据库存储在 /var/lib/docker/volumes/ 中有多安全?
- docker - docker.service 无法运行“启动”任务:没有这样的文件或目录
- javascript - 在 useCallback 钩子中获取 ref null
- java - 防止 org.springframework.messaging.MessagingException 打印堆栈跟踪
- kubernetes - Treafik 让我们在 GKE 上加密最简单的例子
- reactjs - 以编程方式将图像导入 ReactJS?
- sas - SAS 中的条件合并
- c - C中双因子方程的尾递归
- python - padding_idx 在 nn.embeddings() 中做了什么
- git - ssh -vvvT git@github.com 有时卡在 debug1: Connecting to github.com port 22