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.

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

Solutions Collecting From Web of "Android: анимация изменений в содержании GridView"

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

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

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

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

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

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

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

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

Я нашел эту ссылку ресурса весьма полезной для работы с анимацией для других макетов, таких как LinearLayout и т. Д .: http://developer.android.com/training/animation/layout.html Надеюсь, это поможет. Вы также можете посмотреть https://github.com/nhaarman/ListViewAnimations для вдохновения