AnimateLayoutChanges не работает хорошо с вложенным макетом?

У меня есть вложенный макет, как показано ниже:

<LinearLayout> <!----Parent layout---> <LinearLayout> <!-----child 1---> ... </LinearLayout> <!----child 1 ended---> <LinearLayout> <!-----child 2---> ... </LinearLayout> <!----child 2 ended---> </LinearLayout> <!----Parent endded---> 

Проблема, с которой я Linearlayout сейчас, состоит в том, что, поскольку все мои элементы данных находятся в дочернем 1 или дочернем 2 Linearlayout , если я добавляю или удаляю элемент, дочерний linearlayout будет анимировать с эффектом animateLayoutChanges, но родительский макет не будет делать никакой анимации. (У меня есть android:animateLayoutChanges установлен в true для всех линейных макетов). Особенно, когда я удаляю элемент в дочернем 1, эффект анимации становится странным (в основном ребенок 2 будет прыгать, пока ребенок 1 все еще делает свою анимацию).

Кто-нибудь знает, как это решить?

благодаря

ОБНОВИТЬ

Вскоре после того, как я разместил этот вопрос, я нашел это на сайте разработчика Android в API LayoutTransition.

Использование LayoutTransition на нескольких уровнях иерархии вложенных представлений может не работать из-за взаимосвязи различных уровней макета.

Так есть ли кто-нибудь, кто работает над предложениями по этой проблеме?

Solutions Collecting From Web of "AnimateLayoutChanges не работает хорошо с вложенным макетом?"

Свойство animateLayoutChanges использует LayoutTransitions , которые оживляют как LayoutTransitions макета, так и от Android 4.0 вперед, предков в иерархии макета вплоть до вершины дерева. В Honeycomb будут анимированы только дети макета. Дополнительную информацию см. В этом блоге .

К сожалению, кажется, что в настоящее время нет простого способа, чтобы братья и сестры макета реагировали на его LayoutTransitions . Вы можете попробовать использовать TransitionListener для получения уведомлений, когда границы макета меняются, и соответственно переместить представления для сестер с помощью Animators. См. Второй ответ Чет Хаазе в этой записи Google+ .

EDIT – Оказывается, есть способ. В Android 4.1+ (API-уровень 16+) вы можете использовать тип перехода макета CHANGING , который по умолчанию отключен. Чтобы включить его в код:

 ViewGroup layout = (ViewGroup) findViewById(R.id.yourLayout); LayoutTransition layoutTransition = layout.getLayoutTransition(); layoutTransition.enableTransitionType(LayoutTransition.CHANGING); 

Итак, в вашем примере, чтобы анимировать макет child 2, вам нужно включить для него преобразование макета CHANGING . Затем преобразование будет применено, когда произойдет изменение границ его родителя.

Смотрите это видео DevBytes для получения более подробной информации.

Похоже, что отсроченный переход на родителя также работает для анимации. По крайней мере, для меня следующий код дает правильную анимацию expand / collapse.

 expandTrigger.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TransitionManager.beginDelayedTransition(parentLayout); expanded = !expanded; child1.setVisibility(expanded ? View.VISIBLE : View.GONE); } }); 

Для глубоко вложенных макетов вам иногда может понадобиться использовать родителя выше в иерархии в вызове TransitionManager .

Мы добавили атрибут android: animateLayoutChanges к нашему LinearLayout, но это изменение не вызвало анимацию. Чтобы исправить это, используйте этот код:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { ((ViewGroup) findViewById(R.id.llRoot)).getLayoutTransition() .enableTransitionType(LayoutTransition.CHANGING); } 

Подробнее .