- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在适配器类中实现 onDragDrop 方法。
public boolean onDragDrop(int fromPosition, int toPosition) {
Collections.swap(list, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
if (fromPosition < toPosition) {
notifyItemRangeChanged(fromPosition, list.size());
} else {
notifyItemRangeChanged(toPosition, list.size());
}
return true;
}
我遇到的问题是onDragDrop方法实现的时候,动画不好;有元素被替换前的痕迹。我知道对于拖放,只需 notifyItemMoved 方法就足够了,有了它,动画就完美了。我实现 notifyItemRangeChanged 的原因是拖放后,我希望数据得到刷新。
我浏览了很多 StackOverflow 帖子并尝试实现这些建议,但没有任何效果。感谢您的帮助。
最佳答案
尝试向您的 notifyItemRangeChanged()
调用添加第三个参数。它实际上可以是任何对象,但我推荐 Boolean.FALSE
,因为它不会占用任何额外的内存,而且“false”和“不要运行我不想要的动画”是一些相关概念。
if (fromPosition < toPosition) {
notifyItemRangeChanged(fromPosition, list.size(), Boolean.FALSE);
} else {
notifyItemRangeChanged(toPosition, list.size(), Boolean.FALSE);
}
这应该起作用的原因与当您通知适配器项目已更改时整个 RecyclerView 系统所做的事情有关。该过程的一部分涉及 DefaultItemAnimator
,它必须决定是否重新使用旧的 ViewHolder 实例。您想要重复使用,但您没有得到它。
当您将第三个参数传递给 notifyItemRangeChanged()
时,该第三个参数将作为“有效负载”在系统中传递。 DefaultItemAnimator
是接收此 payload 的系统的一部分,它根据此 payload 是否存在来决定是否重新使用 ViewHolders。
@Override
public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull List<Object> payloads) {
return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads);
}
在您当前的代码中,没有有效负载,因此不会重复使用 ViewHolder。这会导致“旧”ViewHolder 淡出和"new"ViewHolder 淡入的动画,看起来非常像闪烁。
当您添加第三个参数时,突然有一个有效负载。同样,有效载荷是什么并不重要,重要的是它存在。现在您的 ViewHolder 可以重复使用,因此没有淡入/淡出动画。
关于java - 使用itemTouchViewer在Recyclerview中拖放不影响动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014199/
我是一名优秀的程序员,十分优秀!