Ich möchte die Elemente meiner recyclerView erweitern / reduzieren, um weitere Informationen anzuzeigen. Ich möchte den gleichen Effekt wie SlideExpandableListView erzielen .
Grundsätzlich habe ich in meinem viewHolder eine Ansicht, die nicht sichtbar ist, und ich möchte eine reibungslose Animation zum Erweitern / Reduzieren erstellen, anstatt die Sichtbarkeit nur auf SICHTBAR / GEGANGEN zu setzen. Ich brauche immer nur ein Element, das gleichzeitig erweitert werden soll, und es wäre cool, eine gewisse Höhe zu haben, um zu zeigen, dass das Element ausgewählt ist.
Dies ist der gleiche Effekt wie in der neuen Liste der letzten Anrufe in Android. Die Optionen "CALL BACK" und "DETAILS" sind nur sichtbar, wenn ein Element ausgewählt ist.
Antworten:
Verwenden Sie für diesen Effekt keine Bibliothek, sondern verwenden Sie die empfohlene Methode gemäß Google I / O. Gehen Sie in der onBindViewHolder- Methode Ihres recyclerView folgendermaßen vor :
Und für die coolen Effekte, die Sie wollten, verwenden Sie diese als Ihre list_item-Attribute:
Dabei ist comment_background:
und comment_selection ist:
quelle
TransitionManager.beginDelayedTransition(recyclerView);
Problem, wenn ich die Referenz für die Recycler-Ansicht nicht verwenden kann.recyclerView
als Parameter im Konstruktor für den Adapter übergebenDafür brauchte man nur einfache Zeilen, die nicht kompliziert waren
Fügen Sie in Ihrer onBindViewHolder-Methode den folgenden Code hinzu
Für diejenigen, die nur ein Element erweitern und andere reduzieren möchten. Benutze das
Deklarieren Sie zuerst eine globale Variable mit previousExpandedPosition = -1
dann
Getan!!!. Einfach und bescheiden .. :)
quelle
OnClickListener
s aufonCreateViewHolder
anstelle vononBindViewHolder
RecyclerView
nur die Arbeit erledigt werden kann. Ich meine, was bringt esLayoutManager
sonst, wenn die Layouts nicht verwaltet werden ? Diese Lösung ist besser als die am besten gewählte Lösung, da sie weniger Code enthält, dieRecyclerView
Dinge handhaben lässt und besser funktioniert!Nicht zu sagen, dass dies der beste Ansatz ist, aber es scheint für mich zu funktionieren.
Den vollständigen Code finden Sie unter: Beispielcode unter: https://github.com/dbleicher/recyclerview-grid-quickreturn
Fügen Sie zunächst den erweiterten Bereich zu Ihrem Zellen- / Elementlayout hinzu und machen Sie das umschließende Zellenlayout animateLayoutChanges = "true". Dadurch wird sichergestellt, dass das Erweitern / Reduzieren animiert wird:
Lassen Sie dann Ihre RV-Adapterklasse View.OnClickListener implementieren, damit Sie auf das angeklickte Element reagieren können. Fügen Sie ein int-Feld hinzu, um die Position der einen erweiterten Ansicht zu halten, und initialisieren Sie sie auf einen negativen Wert:
Implementieren Sie abschließend Ihre ViewHolder-, onBindViewHolder () -Methoden und überschreiben Sie die onClick () -Methode. Sie erweitern die Ansicht in onBindViewHolder, wenn ihre Position gleich "expandedPosition" ist, und blenden sie aus, wenn nicht. Sie legen den Wert von expandPosition im onClick-Listener fest:
Dies sollte jeweils nur ein Element erweitern und die Systemstandardanimation für die Layoutänderung verwenden. Zumindest funktioniert es bei mir. Ich hoffe es hilft.
quelle
expandAlarm
Funktion inAlarmClockFragment.java
Dateien führt den Erweiterungsteil aus.onClick()
soll ich überschreiben? Es gibt keineonClick
im Adapter.Es gibt eine sehr einfach zu verwendende Bibliothek mit Gradle-Unterstützung: https://github.com/cachapa/ExpandableLayout .
Direkt aus den Bibliotheksdokumenten:
Nachdem Sie Ihre erweiterbaren Ansichten markiert haben , rufen Sie einfach eine dieser Methoden für den Container auf :
expand()
,collapse()
odertoggle()
quelle
Ich weiß, es ist lange her, dass die ursprüngliche Frage veröffentlicht wurde. Aber ich denke für langsame wie mich würde eine Erklärung der Antwort von @ Heisenberg helfen.
Deklarieren Sie zwei Variablen in der Adapterklasse als
Dann in onBindViewHolder wie in der ursprünglichen Antwort angegeben.
Und schließlich, um das recyclerView-Objekt in der Adapterüberschreibung zu erhalten
Hoffe das hilft.
quelle
Es ist einfach nicht erforderlich, Bibliotheken von Drittanbietern zu verwenden. Eine kleine Änderung an der in Google I / O 2016 demonstrierten Methode und Heisenberg zu diesem Thema vorgestellten reicht aus.
Da das
notifyDataSetChanged()
Ganze neu gezeichnet wirdRecyclerView
,notifyDataItemChanged()
ist dies eine bessere Option (nicht die beste), da wir die Position und dasViewHolder
zur Verfügung haben undnotifyDataItemChanged()
nur das BesondereViewHolder
an einer bestimmten Position neu zeichnen .Das Problem ist jedoch, dass das vorzeitige Verschwinden des
ViewHolder
beim Klicken und dessen Auftreten nicht beseitigt wird, selbst wennnotifyDataItemChanged()
es verwendet wird.Der folgende Code greift nicht auf
notifyDataSetChanged()
oder zurücknotifyDataItemChanged()
und wird auf API 23 getestet und funktioniert wie ein Zauber, wenn er in einer RecyclerView verwendet wird, in der jeder ViewHolder ein Stammelement hatCardView
:prev_position
ist eine globale Ganzzahl, die mit -1 initialisiert ist.details
ist die vollständige Ansicht, die beim Erweitern angezeigt und beim Reduzieren getarnt wird.Wie gesagt, das Wurzelelement von
ViewHolder
ist einCardView
mitforeground
undstateListAnimator
Attribute, die genau so definiert sind, wie es Heisenberg zu diesem Thema gesagt hat.UPDATE: Die obige Demonstration wird das zuvor erweiterte Element reduzieren, wenn eines davon erweitert wird. Um dieses Verhalten zu ändern und das erweiterte Element so zu belassen, wie es ist, auch wenn ein anderes Element erweitert wird, benötigen Sie den folgenden Code.
UPDATE: Wenn Sie die letzten Elemente in der Liste erweitern, wird sie möglicherweise nicht vollständig sichtbar, da der erweiterte Bereich unter dem Bildschirm angezeigt wird. Verwenden Sie den folgenden Code, um das vollständige Element auf dem Bildschirm anzuzeigen.
WICHTIG: Damit die oben genannten Demonstrationen funktionieren, muss eine Instanz von RecyclerView und dessen LayoutManager (der spätere aus Gründen der Flexibilität) in ihrem Code gespeichert werden.
quelle
notifyItemChanged
weil ich einImageView
Bild habe, das von einer URL geladen wird.notifyItemChanged
Nachladen meines Bildes sieht es komisch ausTransitionManager.beginDelayedTransition(recycler);
großartiger Fund. Aber ich fand heraus, dass bei Verwendung dieser Methode, wenn ich mehrere Zeilen nacheinander auf Spam klicke, dies schließlich einen internen Absturz auslöstThe specified child already has a parent. You must call removeView() on the child's parent first
. Ich kann mir vorstellen, dass dies auf das Sichtrecycling innerhalb der Sichtgrenzen des Recyclers zurückzuführen ist, aber ich kann es nicht genau sagen. Hatte jemand das gleiche Problem?Nach der Verwendung mit Wohnsitz der empfohlene Weg erweiterbare / reduzierbare Elemente der Umsetzung in ein
RecyclerView
auf RecyclerView Aufklappen / Zuklappen Artikel beantwortet von Heisen , habe ich einige deutliche Artefakte zu sehen , wenn derRecyclerView
durch den Aufruf aktualisiert wirdTransitionManager.beginDelayedTransition(ViewGroup)
und anschließendnotifyDatasetChanged()
.Seine ursprüngliche Antwort:
Geändert:
int
, die das erweiterte Element verfolgtViewHolder
beim Reduzieren von Elementen verwendetBeachten Sie, dass die Methode
TransitionManager.beginDelayedTransition(ViewGroup)
undnotifyDataSetChanged()
ersetzt werden, umnotifyItemChanged(int)
auf ein bestimmtes Element und einige kleine Verbesserungen abzuzielen.Nach der Änderung sollten die vorherigen unerwünschten Effekte verschwunden sein. Dies ist jedoch möglicherweise nicht die perfekte Lösung. Es hat nur getan, was ich wollte, und die Schandflecken beseitigt.
::BEARBEITEN::
Zur Verdeutlichung sind beide
mExpandedPosition
undmExpandedHolder
global.quelle
notifyItemChanged()
. Sie können die Elementhöhe manuell animieren, ändern und Ansichten hinzufügen.Gehen Sie wie folgt vor, nachdem Sie den onClick-Listener auf die ViewHolder-Klasse festgelegt haben:
Ich denke, das sollte helfen, so habe ich es implementiert und mache das gleiche, was Google in der letzten Anrufansicht macht.
quelle
Ich bin überrascht, dass es noch keine präzise Antwort gibt, obwohl eine solche Animation zum Erweitern / Reduzieren mit nur 2 Codezeilen sehr einfach zu erreichen ist:
zusammen mit
Für mich waren die Erklärungen im folgenden Link wirklich nützlich: https://medium.com/@nikola.jakshic/how-to-expand-collapse-items-in-recyclerview-49a648a403a6
quelle
quelle
Verwenden Sie zwei Ansichtstypen in Ihrem
RVAdapter
. Eine für erweitertes Layout und eine für reduziert. Und die Magie entsteht, wenn Sieandroid:animateLayoutChanges="true"
fürRecyclerView
Checkout den Effekt festlegen, der in diesem Video um 0:42 Uhr erzielt wirdquelle