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

Android: анимация изменений в содержании GridView

У меня есть GridView макетов, которые можно динамически добавлять или удалять в сетку.

В iOS собственное поведение элементов GridView заключается в том, что другие элементы сетки будут перемещаться по месту удаленного элемента или скользить, чтобы освободить место при добавлении нового элемента.

Однако на Android поведение просто для того, чтобы изменения моментально появлялись на экране. Я попытался добавить пользовательские анимации к каждому вызову getView(), используя некоторые трюки в адаптере GridView, но это привело к возникновению некоторых проблем:

Android GridView загружает индексный элемент 0 в слот более позднего индекса при изменении набора данных

Я пытался, чтобы отдельные представления управляли анимацией вместо метода getView() адаптера, но конечный результат был идентичным.

Я также попытался использовать GridLayoutAnimationController, например:

Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein);
GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f);
mGrid.setLayoutAnimation(controller);

Это работает с начальной загрузкой всего содержимого GridView, но любые изменения в этом содержимом сразу же появляются, как и по умолчанию.

Я чувствую, что это довольно простая функция, и должен быть более простой способ сделать это. Лучшее, что я видел при поиске в Интернете, - это библиотека, которая анимирует элементы GridView, которые меняют места в сетке, но это не то, что я Я ищу (в той же библиотеке, когда вы удаляете элемент из Grid через удаление, тот же самый мгновенный эффект, который я пытаюсь избежать, возникает).

Общим ответом на SO, который я также видел, является "Посмотрите на APIDemos, есть много примеров". Но, насколько я вижу, на самом деле нет примеров для анимации изменений содержимого GridView.

Любая помощь приветствуется, спасибо.

4b9b3361

Ответ 1

Chet Haase вышел с хорошим видео о том, как правильно обрабатывать анимацию ListView. Основная концепция может быть применена к GridViews. Вы можете найти видео здесь.

Если вы разрабатываете API 1.0+, вы не сможете использовать упомянутые функции анимации, упомянутые в видео (например, ViewPropertyAnimator), если вы не используете NineOldAndroids.

Ответ 2

Я думаю, что для AdapterViews LayoutTransition ViewGroup не будет работать. Рассматривая исходный код, ViewGroup обеспечивает переход анимаций перехода других детей к вызовам addView и removeView, но полученный AdapterView не использует эти методы, поскольку он полагается на адаптер для предоставления представлений.

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

И если я понимаю это правильно, GridLayoutAnimationController - это чередующиеся анимации для детей по мере их заполнения (т.е. первый раз или полное ретранслирование всего списка, начиная с пустого), а не анимация на месте изменения макета окружающих детей после добавления или удаления. так что дети появляются, затухающие или движущиеся или вращающиеся - всегда по одному, от первого до последнего.

Наконец, предлагаемое решение: если вам не нужен вид на основе адаптера, вы можете переключиться на GridLayout или LinearLayout. То, что animateLayoutChanges="true" будет работать, и то, что всегда используют демоверсии "layout animation". Примечание. LayoutTransition требует минимального уровня api 11. и для GridLayout требуется api14.

Ответ 3

После внесения каких-либо изменений в GridView, например .remove() вы должны вызвать mGrid.startLayoutAnimation();

GridView не сделает это автоматически для вас. Вы должны запустить его вручную; -)