17149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas/*
27149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * Copyright (C) 2017 The Android Open Source Project
37149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas *
47149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * Licensed under the Apache License, Version 2.0 (the "License");
57149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * you may not use this file except in compliance with the License.
67149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * You may obtain a copy of the License at
77149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas *
87149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas *      http://www.apache.org/licenses/LICENSE-2.0
97149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas *
107149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * Unless required by applicable law or agreed to in writing, software
117149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * distributed under the License is distributed on an "AS IS" BASIS,
127149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * See the License for the specific language governing permissions and
147149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * limitations under the License.
157149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas */
167149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
177149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikaspackage com.android.internal.widget;
187149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
197149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport android.annotation.NonNull;
207149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport android.annotation.Nullable;
217149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport android.util.Log;
227149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport android.view.View;
237149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
247149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport com.android.internal.widget.RecyclerView.Adapter;
257149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport com.android.internal.widget.RecyclerView.ViewHolder;
267149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
277149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas/**
287149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * A wrapper class for ItemAnimator that records View bounds and decides whether it should run
297149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * move, change, add or remove animations. This class also replicates the original ItemAnimator
307149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * API.
317149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * <p>
327149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * It uses {@link ItemHolderInfo} to track the bounds information of the Views. If you would like
337149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * to
347149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * extend this class, you can override {@link #obtainHolderInfo()} method to provide your own info
357149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * class that extends {@link ItemHolderInfo}.
367149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas */
377149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikaspublic abstract class SimpleItemAnimator extends RecyclerView.ItemAnimator {
387149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
397149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    private static final boolean DEBUG = false;
407149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
417149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    private static final String TAG = "SimpleItemAnimator";
427149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
437149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    boolean mSupportsChangeAnimations = true;
447149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
457149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
467149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Returns whether this ItemAnimator supports animations of change events.
477149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
487149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @return true if change animations are supported, false otherwise
497149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
507149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @SuppressWarnings("unused")
517149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public boolean getSupportsChangeAnimations() {
527149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        return mSupportsChangeAnimations;
537149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
547149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
557149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
567149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Sets whether this ItemAnimator supports animations of item change events.
577149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * If you set this property to false, actions on the data set which change the
587149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * contents of items will not be animated. What those animations do is left
597149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * up to the discretion of the ItemAnimator subclass, in its
607149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateChange(ViewHolder, ViewHolder, int, int, int, int)} implementation.
617149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The value of this property is true by default.
627149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
637149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param supportsChangeAnimations true if change animations are supported by
647149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                                 this ItemAnimator, false otherwise. If the property is false,
657149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                                 the ItemAnimator
667149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                                 will not receive a call to
677149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                                 {@link #animateChange(ViewHolder, ViewHolder, int, int, int,
687149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                                 int)} when changes occur.
697149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see Adapter#notifyItemChanged(int)
707149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see Adapter#notifyItemRangeChanged(int, int)
717149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
727149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void setSupportsChangeAnimations(boolean supportsChangeAnimations) {
737149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        mSupportsChangeAnimations = supportsChangeAnimations;
747149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
757149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
767149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
777149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@inheritDoc}
787149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
797149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @return True if change animations are not supported or the ViewHolder is invalid,
807149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * false otherwise.
817149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
827149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see #setSupportsChangeAnimations(boolean)
837149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
847149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @Override
857149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) {
867149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        return !mSupportsChangeAnimations || viewHolder.isInvalid();
877149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
887149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
897149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @Override
907149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public boolean animateDisappearance(@NonNull ViewHolder viewHolder,
917149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            @NonNull ItemHolderInfo preLayoutInfo, @Nullable ItemHolderInfo postLayoutInfo) {
927149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        int oldLeft = preLayoutInfo.left;
937149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        int oldTop = preLayoutInfo.top;
947149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        View disappearingItemView = viewHolder.itemView;
957149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        int newLeft = postLayoutInfo == null ? disappearingItemView.getLeft() : postLayoutInfo.left;
967149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        int newTop = postLayoutInfo == null ? disappearingItemView.getTop() : postLayoutInfo.top;
977149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        if (!viewHolder.isRemoved() && (oldLeft != newLeft || oldTop != newTop)) {
987149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            disappearingItemView.layout(newLeft, newTop,
997149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                    newLeft + disappearingItemView.getWidth(),
1007149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                    newTop + disappearingItemView.getHeight());
1017149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            if (DEBUG) {
1027149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                Log.d(TAG, "DISAPPEARING: " + viewHolder + " with view " + disappearingItemView);
1037149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            }
1047149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            return animateMove(viewHolder, oldLeft, oldTop, newLeft, newTop);
1057149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        } else {
1067149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            if (DEBUG) {
1077149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                Log.d(TAG, "REMOVED: " + viewHolder + " with view " + disappearingItemView);
1087149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            }
1097149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            return animateRemove(viewHolder);
1107149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        }
1117149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
1127149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
1137149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @Override
1147149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public boolean animateAppearance(@NonNull ViewHolder viewHolder,
1157149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
1167149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        if (preLayoutInfo != null && (preLayoutInfo.left != postLayoutInfo.left
1177149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                || preLayoutInfo.top != postLayoutInfo.top)) {
1187149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            // slide items in if before/after locations differ
1197149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            if (DEBUG) {
1207149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                Log.d(TAG, "APPEARING: " + viewHolder + " with view " + viewHolder);
1217149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            }
1227149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            return animateMove(viewHolder, preLayoutInfo.left, preLayoutInfo.top,
1237149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                    postLayoutInfo.left, postLayoutInfo.top);
1247149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        } else {
1257149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            if (DEBUG) {
1267149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                Log.d(TAG, "ADDED: " + viewHolder + " with view " + viewHolder);
1277149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            }
1287149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            return animateAdd(viewHolder);
1297149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        }
1307149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
1317149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
1327149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @Override
1337149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public boolean animatePersistence(@NonNull ViewHolder viewHolder,
1347149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            @NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo) {
1357149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        if (preInfo.left != postInfo.left || preInfo.top != postInfo.top) {
1367149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            if (DEBUG) {
1377149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                Log.d(TAG, "PERSISTENT: " + viewHolder
1387149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                        + " with view " + viewHolder.itemView);
1397149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            }
1407149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            return animateMove(viewHolder,
1417149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas                    preInfo.left, preInfo.top, postInfo.left, postInfo.top);
1427149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        }
1437149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        dispatchMoveFinished(viewHolder);
1447149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        return false;
1457149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
1467149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
1477149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @Override
1487149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public boolean animateChange(@NonNull ViewHolder oldHolder, @NonNull ViewHolder newHolder,
1497149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            @NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo) {
1507149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        if (DEBUG) {
1517149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            Log.d(TAG, "CHANGED: " + oldHolder + " with view " + oldHolder.itemView);
1527149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        }
1537149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        final int fromLeft = preInfo.left;
1547149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        final int fromTop = preInfo.top;
1557149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        final int toLeft, toTop;
1567149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        if (newHolder.shouldIgnore()) {
1577149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            toLeft = preInfo.left;
1587149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            toTop = preInfo.top;
1597149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        } else {
1607149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            toLeft = postInfo.left;
1617149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            toTop = postInfo.top;
1627149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        }
1637149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        return animateChange(oldHolder, newHolder, fromLeft, fromTop, toLeft, toTop);
1647149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
1657149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
1667149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
1677149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when an item is removed from the RecyclerView. Implementors can choose
1687149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * whether and how to animate that change, but must always call
1697149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #dispatchRemoveFinished(ViewHolder)} when done, either
1707149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * immediately (if no animation will occur) or after the animation actually finishes.
1717149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The return value indicates whether an animation has been set up and whether the
1727149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * ItemAnimator's {@link #runPendingAnimations()} method should be called at the
1737149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * next opportunity. This mechanism allows ItemAnimator to set up individual animations
1747149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * as separate calls to {@link #animateAdd(ViewHolder) animateAdd()},
1757149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateMove(ViewHolder, int, int, int, int) animateMove()},
1767149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateRemove(ViewHolder) animateRemove()}, and
1777149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateChange(ViewHolder, ViewHolder, int, int, int, int)} come in one by one,
1787149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * then start the animations together in the later call to {@link #runPendingAnimations()}.
1797149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
1807149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * <p>This method may also be called for disappearing items which continue to exist in the
1817149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * RecyclerView, but for which the system does not have enough information to animate
1827149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * them out of view. In that case, the default animation for removing items is run
1837149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * on those items as well.</p>
1847149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
1857149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param holder The item that is being removed.
1867149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @return true if a later call to {@link #runPendingAnimations()} is requested,
1877149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * false otherwise.
1887149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
1897149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public abstract boolean animateRemove(ViewHolder holder);
1907149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
1917149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
1927149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when an item is added to the RecyclerView. Implementors can choose
1937149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * whether and how to animate that change, but must always call
1947149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #dispatchAddFinished(ViewHolder)} when done, either
1957149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * immediately (if no animation will occur) or after the animation actually finishes.
1967149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The return value indicates whether an animation has been set up and whether the
1977149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * ItemAnimator's {@link #runPendingAnimations()} method should be called at the
1987149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * next opportunity. This mechanism allows ItemAnimator to set up individual animations
1997149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * as separate calls to {@link #animateAdd(ViewHolder) animateAdd()},
2007149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateMove(ViewHolder, int, int, int, int) animateMove()},
2017149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateRemove(ViewHolder) animateRemove()}, and
2027149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateChange(ViewHolder, ViewHolder, int, int, int, int)} come in one by one,
2037149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * then start the animations together in the later call to {@link #runPendingAnimations()}.
2047149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
2057149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * <p>This method may also be called for appearing items which were already in the
2067149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * RecyclerView, but for which the system does not have enough information to animate
2077149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * them into view. In that case, the default animation for adding items is run
2087149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * on those items as well.</p>
2097149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
2107149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param holder The item that is being added.
2117149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @return true if a later call to {@link #runPendingAnimations()} is requested,
2127149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * false otherwise.
2137149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
2147149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public abstract boolean animateAdd(ViewHolder holder);
2157149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
2167149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
2177149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when an item is moved in the RecyclerView. Implementors can choose
2187149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * whether and how to animate that change, but must always call
2197149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #dispatchMoveFinished(ViewHolder)} when done, either
2207149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * immediately (if no animation will occur) or after the animation actually finishes.
2217149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The return value indicates whether an animation has been set up and whether the
2227149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * ItemAnimator's {@link #runPendingAnimations()} method should be called at the
2237149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * next opportunity. This mechanism allows ItemAnimator to set up individual animations
2247149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * as separate calls to {@link #animateAdd(ViewHolder) animateAdd()},
2257149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateMove(ViewHolder, int, int, int, int) animateMove()},
2267149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateRemove(ViewHolder) animateRemove()}, and
2277149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateChange(ViewHolder, ViewHolder, int, int, int, int)} come in one by one,
2287149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * then start the animations together in the later call to {@link #runPendingAnimations()}.
2297149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
2307149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param holder The item that is being moved.
2317149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @return true if a later call to {@link #runPendingAnimations()} is requested,
2327149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * false otherwise.
2337149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
2347149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public abstract boolean animateMove(ViewHolder holder, int fromX, int fromY,
2357149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            int toX, int toY);
2367149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
2377149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
2387149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when an item is changed in the RecyclerView, as indicated by a call to
2397149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link Adapter#notifyItemChanged(int)} or
2407149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link Adapter#notifyItemRangeChanged(int, int)}.
2417149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * <p>
2427149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Implementers can choose whether and how to animate changes, but must always call
2437149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #dispatchChangeFinished(ViewHolder, boolean)} for each non-null distinct ViewHolder,
2447149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * either immediately (if no animation will occur) or after the animation actually finishes.
2457149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * If the {@code oldHolder} is the same ViewHolder as the {@code newHolder}, you must call
2467149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #dispatchChangeFinished(ViewHolder, boolean)} once and only once. In that case, the
2477149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * second parameter of {@code dispatchChangeFinished} is ignored.
2487149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * <p>
2497149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The return value indicates whether an animation has been set up and whether the
2507149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * ItemAnimator's {@link #runPendingAnimations()} method should be called at the
2517149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * next opportunity. This mechanism allows ItemAnimator to set up individual animations
2527149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * as separate calls to {@link #animateAdd(ViewHolder) animateAdd()},
2537149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateMove(ViewHolder, int, int, int, int) animateMove()},
2547149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateRemove(ViewHolder) animateRemove()}, and
2557149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * {@link #animateChange(ViewHolder, ViewHolder, int, int, int, int)} come in one by one,
2567149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * then start the animations together in the later call to {@link #runPendingAnimations()}.
2577149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
2587149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param oldHolder The original item that changed.
2597149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param newHolder The new item that was created with the changed content. Might be null
2607149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param fromLeft  Left of the old view holder
2617149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param fromTop   Top of the old view holder
2627149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param toLeft    Left of the new view holder
2637149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param toTop     Top of the new view holder
2647149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @return true if a later call to {@link #runPendingAnimations()} is requested,
2657149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * false otherwise.
2667149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
2677149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public abstract boolean animateChange(ViewHolder oldHolder,
2687149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas            ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop);
2697149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
2707149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
2717149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when a remove animation is done.
2727149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
2737149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The item which has been removed
2747149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see RecyclerView.ItemAnimator#animateDisappearance(ViewHolder, ItemHolderInfo,
2757149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * ItemHolderInfo)
2767149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
2777149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchRemoveFinished(ViewHolder item) {
2787149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onRemoveFinished(item);
2797149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        dispatchAnimationFinished(item);
2807149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
2817149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
2827149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
2837149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when a move animation is done.
2847149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
2857149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The item which has been moved
2867149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see RecyclerView.ItemAnimator#animateDisappearance(ViewHolder, ItemHolderInfo,
2877149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * ItemHolderInfo)
2887149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see RecyclerView.ItemAnimator#animatePersistence(ViewHolder, ItemHolderInfo, ItemHolderInfo)
2897149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see RecyclerView.ItemAnimator#animateAppearance(ViewHolder, ItemHolderInfo, ItemHolderInfo)
2907149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
2917149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchMoveFinished(ViewHolder item) {
2927149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onMoveFinished(item);
2937149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        dispatchAnimationFinished(item);
2947149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
2957149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
2967149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
2977149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when an add animation is done.
2987149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
2997149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The item which has been added
3007149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3017149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchAddFinished(ViewHolder item) {
3027149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onAddFinished(item);
3037149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        dispatchAnimationFinished(item);
3047149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3057149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3067149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3077149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when a change animation is done.
3087149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3097149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item    The item which has been changed (this method must be called for
3107149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                each non-null ViewHolder passed into
3117149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                {@link #animateChange(ViewHolder, ViewHolder, int, int, int, int)}).
3127149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param oldItem true if this is the old item that was changed, false if
3137149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                it is the new item that replaced the old item.
3147149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @see #animateChange(ViewHolder, ViewHolder, int, int, int, int)
3157149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3167149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchChangeFinished(ViewHolder item, boolean oldItem) {
3177149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onChangeFinished(item, oldItem);
3187149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        dispatchAnimationFinished(item);
3197149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3207149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3217149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3227149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when a remove animation is being started.
3237149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3247149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The item being removed
3257149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3267149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchRemoveStarting(ViewHolder item) {
3277149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onRemoveStarting(item);
3287149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3297149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3307149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3317149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when a move animation is being started.
3327149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3337149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The item being moved
3347149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3357149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchMoveStarting(ViewHolder item) {
3367149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onMoveStarting(item);
3377149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3387149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3397149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3407149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when an add animation is being started.
3417149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3427149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The item being added
3437149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3447149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchAddStarting(ViewHolder item) {
3457149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onAddStarting(item);
3467149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3477149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3487149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3497149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Method to be called by subclasses when a change animation is being started.
3507149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3517149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item    The item which has been changed (this method must be called for
3527149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                each non-null ViewHolder passed into
3537149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                {@link #animateChange(ViewHolder, ViewHolder, int, int, int, int)}).
3547149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param oldItem true if this is the old item that was changed, false if
3557149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                it is the new item that replaced the old item.
3567149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3577149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public final void dispatchChangeStarting(ViewHolder item, boolean oldItem) {
3587149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas        onChangeStarting(item, oldItem);
3597149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3607149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3617149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3627149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when a remove animation is being started on the given ViewHolder.
3637149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
3647149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
3657149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
3667149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3677149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The ViewHolder being animated.
3687149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3697149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @SuppressWarnings("UnusedParameters")
3707149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onRemoveStarting(ViewHolder item) {
3717149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3727149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3737149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3747149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when a remove animation has ended on the given ViewHolder.
3757149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
3767149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
3777149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
3787149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3797149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The ViewHolder being animated.
3807149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3817149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onRemoveFinished(ViewHolder item) {
3827149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3837149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3847149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3857149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when an add animation is being started on the given ViewHolder.
3867149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
3877149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
3887149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
3897149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
3907149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The ViewHolder being animated.
3917149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
3927149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @SuppressWarnings("UnusedParameters")
3937149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onAddStarting(ViewHolder item) {
3947149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
3957149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
3967149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
3977149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when an add animation has ended on the given ViewHolder.
3987149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
3997149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
4007149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
4017149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
4027149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The ViewHolder being animated.
4037149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
4047149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onAddFinished(ViewHolder item) {
4057149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
4067149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
4077149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
4087149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when a move animation is being started on the given ViewHolder.
4097149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
4107149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
4117149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
4127149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
4137149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The ViewHolder being animated.
4147149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
4157149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @SuppressWarnings("UnusedParameters")
4167149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onMoveStarting(ViewHolder item) {
4177149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
4187149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
4197149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
4207149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when a move animation has ended on the given ViewHolder.
4217149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
4227149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
4237149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
4247149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
4257149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item The ViewHolder being animated.
4267149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
4277149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onMoveFinished(ViewHolder item) {
4287149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
4297149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
4307149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
4317149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when a change animation is being started on the given ViewHolder.
4327149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
4337149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
4347149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
4357149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
4367149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item    The ViewHolder being animated.
4377149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param oldItem true if this is the old item that was changed, false if
4387149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                it is the new item that replaced the old item.
4397149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
4407149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    @SuppressWarnings("UnusedParameters")
4417149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onChangeStarting(ViewHolder item, boolean oldItem) {
4427149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
4437149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
4447149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    /**
4457149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * Called when a change animation has ended on the given ViewHolder.
4467149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * The default implementation does nothing. Subclasses may wish to override
4477149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * this method to handle any ViewHolder-specific operations linked to animation
4487149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * lifecycles.
4497149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *
4507149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param item    The ViewHolder being animated.
4517149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     * @param oldItem true if this is the old item that was changed, false if
4527149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     *                it is the new item that replaced the old item.
4537149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas     */
4547149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    public void onChangeFinished(ViewHolder item, boolean oldItem) {
4557149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas    }
4567149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas}
4577149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas
458