2014-12-12 2 views
13

У меня есть RecyclerView. Каждый из его элементов вида ресайклера может быть либо расширен, либо нет. Одновременно может быть только один элемент.RecyclerView: размер анимированного элемента

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

Я нашел, что using a LayoutTransition on RecyclerViewmakes it crash.

Но я не смог правильно анимировать изменение позиции между обоими состояниями.

Я попытался getItemAnimator().setSupportsChangeAnimations(true) в сочетании с notifyItemChanged(getPosition()) но есть две проблемы:

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

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

Я создал небольшой демонстрационный проект этой проблемы для обеих попыток. The projects sources are here.

Как создать плавный переход на изменение макета элемента?

+0

Извините, что у меня нет ответа для вас, но я имею дело с одной и той же проблемой, вам удалось заставить ее работать еще? Я буду держать вас в курсе того, что мне удалось! –

+0

Я довольно близко, следите за обновлениями –

+0

Мне не удалось приблизиться к проектам, которые я связал. С нетерпением ждем вашей работы;) –

ответ

11

OK, Итак, я нашел решение, которое не требует вызова notifyItemChanged, поэтому вид не заменяется. Согласитесь, что вам нужно вручную проверить согласованность представления. Для этого я создал небольшую библиотеку, которая позволяет именно то, что я искал, для 5 loc в ViewHolder.

Фокус в том, чтобы анимировать изменение высоты вручную, а не использовать LayoutTransition.

The demo project can be found here.

+0

Разве это не то, что я сказал, и теперь вы зачисляете себя за этот ответ? –

+1

Я так не верю, но мне жаль, если вы чувствуете, что я ограбил вас в любом виде. Это решение не использует notifyDataSetChanged и «вручную» управляет состояниями ячеек, предотвращая «обмен сотами». Кроме того, я поставил это как ответ, а не комментарий, потому что я предоставляю демонстрационный проект, который иллюстрирует, как я это делаю. Пожалуйста, опубликуйте свой ответ с помощью своего демонстрационного проекта здесь, и я буду рад поблагодарить вас за ответ :) –

+0

«lp.height = (int) animation.getAnimatedValue(); _view.setLayoutParams (lp);" - эти строки, взятые из демонстрационного проекта, действительно очень медленный способ оживить что-либо. Я написал об этом здесь и предложил решения (не очень горжусь) http://stackoverflow.com/questions/12729830/expand-listview-item-with-animation/26612450#26612450 – Deepscorn

0

Вместо этого вы должны использовать только notifyItemChanged(getPosition(), new Object()).

В вашем адаптере переопределите onBindViewHolder(GigExtraViewHolder holder, int position, List<Object> payloads), если полезная нагрузка пустая или пустая, выполните свои исходные логики привязки, иначе просто создайте собственную анимацию расширения/свернуть.

Смежные вопросы