Intereting Posts
Почему код gcc emmiting выровнен с границей 2 байта для набора команд ARM? Ошибка камеры «Не удается подключиться к камере» или на некоторых телефонах появляется ошибка «Камера используется другим приложением», Шина событий и жизненный цикл компонентов android ui Ионная Android-сборка перестала работать Как кнопка может получить фокус? Я обновил Android от targetSdk 22 до 23, и я получаю NoSuchMethodError. Как я могу это исправить? Почему так много приложений для Android используют NDK? Android: как сделать клавиатуру введите кнопку сказать «Поиск» и обрабатывать его клик? Всегда ли BroadcastReceiver.onReceive работает в потоке пользовательского интерфейса? Обновление приложения для Android, использующего In App Billing Получить идентификатор ресурса для ссылочной ссылки, используемой в атрибуте стиля Android потребляемый: «уже принадлежит этот элемент», но inventory.hasPurchase () – false Как отображать статическую карту google на андроиде? Genymotion: как загружать apk каждый раз? Пользовательский значок дома в действии Бар Шерлок

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

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

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

Я обнаружил, что использование LayoutTransition on RecyclerView приводит к сбою .

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

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

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

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

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

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

Solutions Collecting From Web of "RecyclerView: изменение размера анимированного объекта"

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

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

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

Вы должны просто использовать notifyItemChanged(getPosition(), new Object()) .

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