Анимация для expandableListView

Можно ли применить анимацию expand или collapse для expandableListView?

Это можно сделать с помощью простого ListView, который содержит первоначально скрытое представление и пользовательский класс, который расширяет анимацию. Основная идея состоит в том, чтобы начать с View.GONE затем постепенно изменить размер поля от отрицательного значения до требуемого размера, установив видимость на View.VISIBLE .

Видеть:

..и наконец

  • Прохладная панель инструментов для элементов ListView + источник

Последний пример содержит весь необходимый код. Это выглядит немного хакерским для меня, особенно тот факт, что вы должны сначала установить view.bottomMargin = -50 или более, иначе анимация не работает должным образом в первый раз, но до сих пор я не нашел жизнеспособной альтернативы (кроме использования ScrollView с вашими собственными элементами контейнера вместо ListView).

И, наконец, это приложение включает приведенный выше пример, среди множества других полезных примеров со ссылками на источники:

Обновление: Google удалил приложение из игрового магазина, предположительно, за нарушение прав на интеллектуальную собственность (хотя он содержал только демонстрации и ссылки на проекты с открытым исходным кодом), автор теперь сделал apk доступным для прямой загрузки с http://goo.gl/ihcgs. Подробнее см. https://plus.google.com/108176685096570584154/posts . NB: Я не связан с автором.

Я сделал аналогичную работу для простого представления списка. Для этого я перепробовал метод getView и применял перевод (вверху) анимации для каждого элемента списка. Степень перевода была определена положением элемента списка.

Я нашел возможное (частичное) решение этой проблемы.

Сначала вам нужно сохранить состояние прокрутки ExpnadableListView:

 @Override public void onScrollStateChanged(final AbsListView view, final int scrollState) { this.mScrollState = scrollState; } public int getScrollState() { return this.mScrollState; } 

Для самого listView вам нужно сохранить группу, на которую была нажата кнопка, так что только ее дети будут анимированы:

 mListView.setOnGroupClickListener(... @Override public boolean onGroupClick(...){ mGroupPosition=groupPosition; 

Теперь, в методе getChildView (), вы проверяете состояние прокрутки, и если он простаивает, вы запускаете анимацию, например:

 public View getChildView(...) { // <=prepare rootView and return it later if (groupPosition==mGroupPosition&&getScrollState() == OnScrollListener.SCROLL_STATE_IDLE) rootView.setAnimation(...) 

Это будет устанавливать анимацию для дочерних просмотров при каждом расширении группы.

Недостатком этого является:

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