diff --git a/animators/src/main/java/jp/wasabeef/recyclerview/animators/BaseItemAnimator.java b/animators/src/main/java/jp/wasabeef/recyclerview/animators/BaseItemAnimator.java index dddd142..f5bf694 100644 --- a/animators/src/main/java/jp/wasabeef/recyclerview/animators/BaseItemAnimator.java +++ b/animators/src/main/java/jp/wasabeef/recyclerview/animators/BaseItemAnimator.java @@ -17,6 +17,7 @@ * */ +import android.support.annotation.NonNull; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPropertyAnimatorCompat; import android.support.v4.view.ViewPropertyAnimatorListener; @@ -30,7 +31,9 @@ import java.util.ArrayList; import java.util.List; -import jp.wasabeef.recyclerview.animators.holder.AnimateViewHolder; +import jp.wasabeef.recyclerview.animators.holder.AnimateAddViewHolder; +import jp.wasabeef.recyclerview.animators.holder.AnimateChangeViewHolder; +import jp.wasabeef.recyclerview.animators.holder.AnimateRemoveViewHolder; import jp.wasabeef.recyclerview.internal.ViewHelper; public abstract class BaseItemAnimator extends SimpleItemAnimator { @@ -107,7 +110,16 @@ public void setInterpolator(Interpolator mInterpolator) { this.mInterpolator = mInterpolator; } - @Override public void runPendingAnimations() { + @Override + public boolean canReuseUpdatedViewHolder(@NonNull final ViewHolder viewHolder, @NonNull final List payloads) { + if (viewHolder instanceof AnimateChangeViewHolder) { + return ((AnimateChangeViewHolder) viewHolder).canAnimateChange(payloads); + } else { + return super.canReuseUpdatedViewHolder(viewHolder, payloads); + } + } + + @Override public void runPendingAnimations() { boolean removalsPending = !mPendingRemovals.isEmpty(); boolean movesPending = !mPendingMoves.isEmpty(); boolean changesPending = !mPendingChanges.isEmpty(); @@ -219,8 +231,8 @@ protected void preAnimateAddImpl(final RecyclerView.ViewHolder holder) { private void preAnimateRemove(final RecyclerView.ViewHolder holder) { ViewHelper.clear(holder.itemView); - if (holder instanceof AnimateViewHolder) { - ((AnimateViewHolder) holder).preAnimateRemoveImpl(holder); + if (holder instanceof AnimateRemoveViewHolder) { + ((AnimateRemoveViewHolder) holder).preAnimateRemoveImpl(holder); } else { preAnimateRemoveImpl(holder); } @@ -229,16 +241,16 @@ private void preAnimateRemove(final RecyclerView.ViewHolder holder) { private void preAnimateAdd(final RecyclerView.ViewHolder holder) { ViewHelper.clear(holder.itemView); - if (holder instanceof AnimateViewHolder) { - ((AnimateViewHolder) holder).preAnimateAddImpl(holder); + if (holder instanceof AnimateAddViewHolder) { + ((AnimateAddViewHolder) holder).preAnimateAddImpl(holder); } else { preAnimateAddImpl(holder); } } private void doAnimateRemove(final RecyclerView.ViewHolder holder) { - if (holder instanceof AnimateViewHolder) { - ((AnimateViewHolder) holder).animateRemoveImpl(holder, new DefaultRemoveVpaListener(holder)); + if (holder instanceof AnimateRemoveViewHolder) { + ((AnimateRemoveViewHolder) holder).animateRemoveImpl(holder, new DefaultRemoveVpaListener(holder)); } else { animateRemoveImpl(holder); } @@ -247,8 +259,8 @@ private void doAnimateRemove(final RecyclerView.ViewHolder holder) { } private void doAnimateAdd(final RecyclerView.ViewHolder holder) { - if (holder instanceof AnimateViewHolder) { - ((AnimateViewHolder) holder).animateAddImpl(holder, new DefaultAddVpaListener(holder)); + if (holder instanceof AnimateAddViewHolder) { + ((AnimateAddViewHolder) holder).animateAddImpl(holder, new DefaultAddVpaListener(holder)); } else { animateAddImpl(holder); } @@ -341,6 +353,12 @@ private void animateMoveImpl(final ViewHolder holder, int fromX, int fromY, int @Override public boolean animateChange(ViewHolder oldHolder, ViewHolder newHolder, int fromX, int fromY, int toX, int toY) { + + if (oldHolder == newHolder && fromX == toX && fromY == toY) { + dispatchChangeFinished(newHolder, true); + return false; + } + final float prevTranslationX = ViewCompat.getTranslationX(oldHolder.itemView); final float prevTranslationY = ViewCompat.getTranslationY(oldHolder.itemView); final float prevAlpha = ViewCompat.getAlpha(oldHolder.itemView); diff --git a/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateAddViewHolder.java b/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateAddViewHolder.java new file mode 100644 index 0000000..0a9e634 --- /dev/null +++ b/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateAddViewHolder.java @@ -0,0 +1,12 @@ +package jp.wasabeef.recyclerview.animators.holder; + +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v7.widget.RecyclerView; + +public interface AnimateAddViewHolder { + + void preAnimateAddImpl(final RecyclerView.ViewHolder holder); + + void animateAddImpl(final RecyclerView.ViewHolder holder, ViewPropertyAnimatorListener listener); + +} diff --git a/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateChangeViewHolder.java b/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateChangeViewHolder.java new file mode 100644 index 0000000..2b0f7a5 --- /dev/null +++ b/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateChangeViewHolder.java @@ -0,0 +1,10 @@ +package jp.wasabeef.recyclerview.animators.holder; +import android.support.annotation.NonNull; + +import java.util.List; + +public interface AnimateChangeViewHolder { + + boolean canAnimateChange(@NonNull List payloads); + +} diff --git a/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateRemoveViewHolder.java b/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateRemoveViewHolder.java new file mode 100644 index 0000000..941a549 --- /dev/null +++ b/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateRemoveViewHolder.java @@ -0,0 +1,12 @@ +package jp.wasabeef.recyclerview.animators.holder; + +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v7.widget.RecyclerView; + +public interface AnimateRemoveViewHolder { + + void preAnimateRemoveImpl(final RecyclerView.ViewHolder holder); + + void animateRemoveImpl(final RecyclerView.ViewHolder holder, ViewPropertyAnimatorListener listener); + +} diff --git a/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateViewHolder.java b/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateViewHolder.java deleted file mode 100644 index b603ec3..0000000 --- a/animators/src/main/java/jp/wasabeef/recyclerview/animators/holder/AnimateViewHolder.java +++ /dev/null @@ -1,16 +0,0 @@ -package jp.wasabeef.recyclerview.animators.holder; - -import android.support.v4.view.ViewPropertyAnimatorListener; -import android.support.v7.widget.RecyclerView; - -public interface AnimateViewHolder { - - void preAnimateAddImpl(final RecyclerView.ViewHolder holder); - - void preAnimateRemoveImpl(final RecyclerView.ViewHolder holder); - - void animateAddImpl(final RecyclerView.ViewHolder holder, ViewPropertyAnimatorListener listener); - - void animateRemoveImpl(final RecyclerView.ViewHolder holder, - ViewPropertyAnimatorListener listener); -}