Можно ли применить анимацию expand или collapse для expandableListView?
Анимация для expandableListView
Ответ 1
Это можно сделать с помощью простого ListView, который содержит первоначально скрытое представление и пользовательский класс, который расширяет анимацию.
Основная идея состоит в том, чтобы начать с View.GONE
, а затем постепенно изменить размер поля от отрицательного значения до требуемого размера, установив видимость на View.VISIBLE
.
См:
- https://github.com/tjerkw/Android-SlideExpandableListView
- Android Animation: Hide/Show Menu
- Как настроить анимацию View.setVisibility(GONE)
.. и, наконец,
Последний пример содержит весь необходимый код. Это выглядит немного хакерским для меня, особенно тот факт, что вы должны сначала установить view.bottomMargin = -50
или больше, иначе анимация не будет работать должным образом в первый раз, но до сих пор я не нашел жизнеспособной альтернативы (кроме использования ScrollView с ваши собственные элементы контейнера вместо ListView).
И, наконец, это приложение включает приведенный выше пример, среди множества других полезных примеров со ссылками на источники:
Обновление. Google удалил приложение из магазина воспроизведения, предположительно, за нарушение прав на интеллектуальную собственность (хотя оно содержало только демо-версии и ссылки на проекты с открытым исходным кодом), автор теперь сделал apk доступным для прямой загрузки из http://goo.gl/ihcgs Подробнее см. https://plus.google.com/108176685096570584154/posts. NB: Я не связан с автором.
Ответ 2
Я сделал аналогичную работу для простого представления списка. Для этого я переопределил метод getView и применил перевод (вверху) анимации для каждого элемента списка. Степень перевода была определена положением элемента списка,
Ответ 3
Я нашел возможное (частичное) обходное решение для этой проблемы.
сначала вам нужно сохранить состояние прокрутки ExpnadableListView:
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
this.mScrollState = scrollState;
}
public int getScrollState() {
return this.mScrollState;
}
для самого спискаView, вам нужно сохранить, какая группа была нажата, чтобы анимировать только его дочерние элементы:
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(...)
при каждом развертывании группы будет отображаться анимация для дочерних элементов.
Недостатком этого является:
- только для расширенных дочерних представлений. вам нужно будет подумать о дополнительной логике, чтобы оживить их при свертывании группы.
- все анимации начинаются сразу. вам нужно будет добавить несколько анимаций один за другим, если вы хотите, чтобы он работал иначе.