Проблема с анимацией Android в элементах RecycleView - PullRequest
0 голосов
/ 16 мая 2018

Я добавил анимацию при нажатии на некоторые элементы кнопок в режиме рециркуляции.

Все работает гладко, однако, когда я прокручиваю список вниз, некоторые кнопки появляются в странном состоянии, как будто они были заморожены во время фазы анимации, даже если анимация не запускалась для этих кнопок, в то время как для других их вид устанавливается на невидимый /ушел.

Это часть кода анимации сжатия, где сжатие является объектом ValueAnimator.

shrink.addUpdateListener { animation ->
        val animatedValue = animation.animatedValue as Int
        v.layoutParams.width = animatedValue
        v.requestLayout()
    }
    shrink.addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationStart(animation: Animator) {
            super.onAnimationStart(animation)
            v.visibility = View.VISIBLE
            v.isEnabled = false
        }
        override fun onAnimationEnd(animation: Animator) {
            super.onAnimationEnd(animation)
            v.layoutParams.width = 0
            v.visibility = View.GONE
            v.isEnabled = false
        }
   }

У меня есть классы View и ViewHolder, в которых я связываю видимость элементов представления корзины при прокрутке.

Есть ли какой-то шаг, который я пропустил в жизненном цикле анимации для совместной работы с элементами представления повторного просмотра? Я думал, что, возможно, я должен позаботиться о onAnimationStop или onAnimationPause случаях, но я не уверен.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 19 июня 2018

Начните с удаления по умолчанию RecyclerView элемента аниматора

recyclerView.setItemAnimator(null);

, а также отмените любую пользовательскую анимацию в адаптере onViewRecycled

0 голосов
/ 12 июня 2018

Я думаю, что причиной вашей проблемы является тот факт, что представления перерабатываются при прокрутке. Если анимация запускается в представлении, а список прокручивается, анимация продолжается, но в какой-то момент представление перезапускается и повторно заполняется, что приводит к странному состоянию.

Решение состоит в том, чтобы отменить анимацию и установить начальное состояние для вида в onBindViewHolder методе вашего адаптера. Шаги, которые я бы сделал в вашем случае:

  1. Свяжите аниматор значений с держателем вида, чтобы у каждого держателя вида был свой аниматор значения.
  2. Запустите анимацию, как вы делаете сейчас, используя аниматор локальных значений держателя просмотра.
  3. Отмена Ваше значение аниматора в onViewRecycled
  4. В onBindViewHolder явно установите видимость вашего представления на видимое, включите его и установите полную ширину.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...