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

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

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

4b9b3361

Ответ 1

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

См:

.. и, наконец,

Последний пример содержит весь необходимый код. Это выглядит немного хакерским для меня, особенно тот факт, что вы должны сначала установить 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(...)

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

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

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