Подтвердить что ты не робот

RecyclerView: изменение размера анимированного объекта

У меня есть RecyclerView. Каждый из его элементов вида ресайклера может быть либо расширен, либо нет. Одновременно может быть только один элемент.

В сущности, я пытаюсь воссоздать список истории в лиллиповом диалоге.

Я нашел, что с использованием LayoutTransition on RecyclerView заставляет его сбой.

Но я не смог правильно анимировать изменение вида элемента между обоими состояниями.

Я пробовал getItemAnimator().setSupportsChangeAnimations(true) в сочетании с notifyItemChanged(getPosition()), но есть две проблемы:

  • Воспроизведение открывается, что делает переход довольно странным, поскольку он исчезает над следующим элементом одновременно с перемещением элемента. Новое представление, которое появляется, не изменяет размер, оно уже находится в полном размере.
  • По мере воссоздания представления старое представление исчезает, а новое исчезает, что делает мерцание фонового цвета представления.

Я также попытался установить LayoutTransition в представлении элемента на время анимации, но проблема с этим подходом заключается в том, что макет RecycleView обновляется немедленно и не следует за анимацией.

Я создал небольшой демонстрационный проект этой проблемы для обеих попыток. Источники проектов здесь.

Как я могу создать плавный переход на изменение макета элемента?

4b9b3361

Ответ 1

ОК, поэтому я нашел решение, которое не включает вызов notifyItemChanged, поэтому представление не заменяется. Согласитесь, что вам нужно вручную проверить согласованность представления. Для этого я создал небольшую библиотеку, которая позволяет именно то, что я искал, для 5 loc в ViewHolder.

Хитрость заключается в том, чтобы изменить изменение высоты вручную, а не использовать LayoutTransition.

Демо-проект можно найти здесь.

Ответ 2

Вместо этого следует использовать notifyItemChanged(getPosition(), new Object()).

В вашем адаптере переопределите onBindViewHolder(GigExtraViewHolder holder, int position, List<Object> payloads), если полезная нагрузка пустая или пустая, выполните свои исходные логики привязки, иначе просто создайте собственную анимацию расширения/свернуть.