Android recycleView swapItems 动画时有时无 如何解决 请给出详细方法和代码
时间: 2024-03-07 12:54:04 浏览: 108
RecycleView 的 swapItems 动画时有时无的问题,通常是因为出现了视图重叠,导致动画效果无法正常展示。下面给出一种解决方案。
首先,我们需要在 Adapter 中实现 swapItems 方法,这里给出一个示例代码:
```
public void swapItems(int fromPosition, int toPosition) {
Collections.swap(mData, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
}
```
然后,在 RecyclerView.ItemAnimator 中添加如下代码:
```
@Override
public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {
final View view = holder.itemView;
final int deltaX = toX - fromX;
final int deltaY = toY - fromY;
if (deltaX == 0 && deltaY == 0) {
dispatchMoveFinished(holder);
return false;
}
ObjectAnimator animX = ObjectAnimator.ofFloat(view, "translationX", 0, deltaX);
ObjectAnimator animY = ObjectAnimator.ofFloat(view, "translationY", 0, deltaY);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.setDuration(getMoveDuration());
animSetXY.setInterpolator(new DecelerateInterpolator());
animSetXY.playTogether(animX, animY);
animSetXY.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
dispatchMoveFinished(holder);
}
});
animSetXY.start();
return true;
}
```
这里的关键是在 onAnimationEnd 方法中调用 dispatchMoveFinished 方法,这样可以保证动画结束后视图不会重叠。
最后,在 RecyclerView 中添加如下代码:
```
recyclerView.setItemAnimator(new DefaultItemAnimator() {
@Override
public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull List<Object> payloads) {
return true;
}
});
```
这样就可以解决 RecycleView swapItems 动画时有时无的问题了。
参考资料:
- https://stackoverflow.com/questions/26649485/recyclerview-itemanimator-prevents-recyclerview-from-animating
阅读全文