Есть ли способ анимировать элементы RecyclerView при прокрутке его?
Я взглянул на DefaultItemAnimator
и RecyclerView.ItemAnimator
, но эти анимации, кажется, вызывается только в том случае, если набор данных изменился, пожалуйста, исправьте меня, если я ошибаюсь.
Я немного запутался в RecyclerView.ItemAnimator.animateMove()
, когда он называется? Я помещал некоторые точки останова в этот класс, но ни один из них не останавливает мое приложение.
Однако вернемся к моему вопросу, как я могу оживить RecyclerView? Я хочу, чтобы некоторые элементы имели другую непрозрачность, зависело от некоторых пользовательских правил.
Я сделал еще несколько reaseach, кажется, что движение анимации - это именно то, что я ищу. Эти методы вызывают из dispatchLayout()
. Вот javadoc этого метода:
Обертка вокруг layoutChildren(), которая обрабатывает анимацию изменений, вызванных макетом. Анимация работает при условии, что существует пять различных видов предметов в игре:
PERSISTENT: элементы видны до и после макета
УДАЛЕН: элементы были видны перед макетом и были удалены приложением
ADDED: элементы не существовали до макета и были добавлены приложением
ИСКАЖЕНИЕ: элементы существуют в наборе данных до/после, но изменены с видимые для невидимых в процессе компоновки (они были удалены экран как побочный эффект других изменений)
APPEARING: элементы существуют в наборе данных до/после, но изменены с невидимые для видимости в процессе компоновки (они были перемещены на экран как побочный эффект других изменений)
Общий подход определяет, какие элементы существуют до/после макета и для каждого из предметов входит одно из пяти состояний. Затем анимация соответственно настроены:
Представления PERSISTENT перемещаются ({@link ItemAnimator # animateMove (ViewHolder, int, int, int, int)}) УДАЛЕННЫЕ виды удаляются ({@link ItemAnimator # animateRemove (ViewHolder)})
Добавлены виды ADDED ({@link ItemAnimator # animateAdd (ViewHolder)})
Представления DISAPPEARING перемещаются за пределы экрана
Представления вида APPEARING перемещаются на экран
До сих пор я ищу ПОСТОЯННОЕ, ИСКЛЮЧИТЕЛЬНОЕ И ПОЯВЛЕНИЕ, но эти методы никогда не вызываются из-за этой строки здесь:
boolean animateChangesSimple = mItemAnimator != null && mItemsAddedOrRemoved
&& !mItemsChanged;
mItemsAddedOrRemoved
просто всегда false, поэтому ни один из этих обратных вызовов не достигается. Любая идея, как правильно установить флаг?