Я хочу развернуть / свернуть элементы моего recyclerView, чтобы показать больше информации. Я хочу добиться того же эффекта от SlideExpandableListView .
В основном в моем viewHolder у меня есть вид, который не виден, и я хочу сделать плавную анимацию развертывания / сворачивания, а не устанавливать видимость только VISIBLE / GONE. Мне нужно только расширить элемент за раз, и было бы здорово иметь некоторую отметку, чтобы показать, что элемент выбран.
Это тот же эффект, что и в новом списке недавних звонков Android. Параметры «ОБРАТНАЯ СВЯЗЬ» и «ДЕТАЛИ» отображаются только при выборе элемента.
Ответы:
Пожалуйста, не используйте какую-либо библиотеку для этого эффекта, вместо этого используйте рекомендуемый способ сделать это в соответствии с Google I / O. В методе onBindViewHolder вашего recyclerView сделайте это:
А для классных эффектов, которые вы хотели, используйте их в качестве атрибутов list_item:
где comment_background:
и comment_selection - это:
источник
TransitionManager.beginDelayedTransition(recyclerView);
если я не могу получить ссылку на представление переработчика.recyclerView
качестве параметра в конструкторе для адаптераДля этого просто нужны простые линии, не сложные
в вашем методе onBindViewHolder добавьте ниже код
Для тех, кто хочет, чтобы только один предмет был расширен, а другие развалились. Использовать это
сначала объявите глобальную переменную с previousExpandedPosition = -1
затем
Готово!!!. Просто и скромно .. :)
источник
OnClickListener
sonCreateViewHolder
вместоonBindViewHolder
RecyclerView
делать работу, я имею в виду, какой смыслLayoutManager
иначе, если он не управляет макетами! Это решение лучше, чем решение с наибольшим количеством голосов, так как оно содержит меньше кода, позволяетRecyclerView
справляться с проблемами и работает лучше!Не сказать, что это лучший подход, но, похоже, он мне подходит.
Полный код можно найти по адресу: Пример кода по адресу: https://github.com/dbleicher/recyclerview-grid-quickreturn
Прежде всего, добавьте расширенную область в макет ячейки / элемента и сделайте компоновку вмещающей ячейки animateLayoutChanges = "true". Это обеспечит анимацию развертывания / свертывания:
Затем сделайте так, чтобы ваш класс адаптера RV реализовал View.OnClickListener, чтобы вы могли воздействовать на элемент, по которому щелкали. Добавьте поле int для хранения позиции одного расширенного представления и инициализируйте его отрицательным значением:
Наконец, реализуйте методы ViewHolder, onBindViewHolder () и переопределите метод onClick (). Вы развернете представление в onBindViewHolder, если его позиция равна «extendedPosition», и скроете его, если нет. Вы устанавливаете значение extendedPosition в слушателе onClick:
Это должно расширять только один элемент за один раз, используя системную анимацию по умолчанию для изменения макета. По крайней мере, это работает для меня. Надеюсь, поможет.
источник
expandAlarm
Функция вAlarmClockFragment.java
файлах выполняет часть расширения.onClick()
я должен переопределить? Там нетonClick
в адаптере.Существует очень простая в использовании библиотека с поддержкой gradle: https://github.com/cachapa/ExpandableLayout .
Прямо из библиотеки документов:
После того, как вы отмечаете свое расширяющиеся точки зрения, просто вызвать любого из этих методов на контейнере:
expand()
,collapse()
илиtoggle()
источник
Я знаю, что прошло много времени с тех пор, как был опубликован оригинальный вопрос. Но я думаю, что для таких, как я, небольшое объяснение ответа @ Heisenberg поможет.
Объявите две переменные в классе адаптера как
Затем в onBindViewHolder, следуя указаниям оригинального ответа.
И, наконец, чтобы получить объект recyclerView в переопределении адаптера
Надеюсь это поможет.
источник
Нет необходимости использовать сторонние библиотеки. Небольшая настройка метода, продемонстрированного в Google I / O 2016 и Гейзенберге на эту тему, делает свое дело.
Поскольку
notifyDataSetChanged()
перерисовывает полныйRecyclerView
,notifyDataItemChanged()
это лучший вариант (не лучший), потому что у нас есть позиция иViewHolder
в нашем распоряжении, иnotifyDataItemChanged()
только перерисовывает конкретныйViewHolder
в данной позиции .Но проблема в том, что преждевременное исчезновение
ViewHolder
щелчка и его появление не устраняется, даже еслиnotifyDataItemChanged()
используется.Следующий код не прибегать к
notifyDataSetChanged()
илиnotifyDataItemChanged()
и испытано на API 23 и работает как шарм при использовании на RecyclerView , где каждый ViewHolder имеет ,CardView
как это корневой элемент:prev_position
глобальное целое число, инициализированное -1.details
это полное представление, которое отображается в развернутом виде и скрыто при свертывании.Как уже говорилось, корневой элемент
ViewHolder
- это атрибутыCardView
withforeground
иstateListAnimator
определены точно так, как сказал Гейзенберг по этой теме.ОБНОВЛЕНИЕ: Приведенная выше демонстрация свернет ранее развернутый элемент, если один из них развернут. Чтобы изменить это поведение и сохранить развернутый элемент таким, какой он есть, даже когда другой элемент развернут, вам потребуется следующий код.
ОБНОВЛЕНИЕ: при развертывании последних элементов в списке, он может не отображаться в полной видимости, потому что расширенная часть находится ниже экрана. Чтобы получить полный элемент на экране, используйте следующий код.
ВАЖНО: чтобы вышеприведенные демонстрации работали, в их коде необходимо сохранить экземпляр RecyclerView и его LayoutManager (последний для гибкости)
источник
notifyItemChanged
потому что у меня естьImageView
изображение загрузки с URL.notifyItemChanged
перезагрузить мое изображение делает это выглядит странноTransitionManager.beginDelayedTransition(recycler);
, большая находка. Но я обнаружил, что при использовании этого метода, если я последовательно щелкаю спам по нескольким строкам, это в конечном итоге вызывает внутренний сбойThe specified child already has a parent. You must call removeView() on the child's parent first
. Я предполагаю, что это происходит из-за представления рециркуляции на границах представления рециркулятора, но я не могу сказать точно. У кого-нибудь была такая же проблема?После использования рекомендованного способа реализации расширяемых / складываемых элементов, находящихся в элементах раскрытия / сворачивания RecyclerView,
RecyclerView
на которые ответил HeisenBerg , я видел некоторые заметные артефакты всякий раз, когда ониRecyclerView
обновляются путем вызоваTransitionManager.beginDelayedTransition(ViewGroup)
и впоследствииnotifyDatasetChanged()
.Его оригинальный ответ:
Изменен:
int
отслеживание расширенного элемента.ViewHolder
используется во время распада элементаОбратите внимание, что метод
TransitionManager.beginDelayedTransition(ViewGroup)
иnotifyDataSetChanged()
замененыnotifyItemChanged(int)
на целевой элемент и некоторые небольшие изменения.После модификации предыдущие нежелательные эффекты должны исчезнуть. Тем не менее, это не может быть идеальным решением. Он делал только то, что хотел, устраняя глазные раны.
::РЕДАКТИРОВАТЬ::
Для пояснения, оба
mExpandedPosition
иmExpandedHolder
являются глобальными.источник
notifyItemChanged()
. Вы можете вручную анимировать и изменять высоту элемента и добавлять виды в него.Выполните следующие действия после установки прослушивателя onClick для класса ViewHolder:
Я думаю, что это должно помочь, вот как я реализовал и делает то же самое, что делает Google в представлении недавних вызовов.
источник
Я удивлен, что пока нет четкого ответа, хотя такую анимацию разворачивания / свертывания очень легко достичь всего с двумя строками кода:
вместе с
Так что для меня объяснения в ссылке ниже были действительно полезны: https://medium.com/@nikola.jakshic/how-to-expand-collapse-items-in-recyclerview-49a648a403a6
источник
источник
Используйте два типа просмотра в вашем
RVAdapter
. Один для расширенного макета, а другой для свернутого. И волшебство происходит с настройкойandroid:animateLayoutChanges="true"
дляRecyclerView
Checkout эффекта, достигнутого с помощью этого в 0:42 в этом видеоисточник