Eine vollständige Antwort, die die Sichtbarkeit beim Klicken umschaltet, auch den Pfeil umdreht und andere Ansichten beim Ausblenden der Komponente auch glatt nach oben bewegt.
private fun toggleRecyclerViewVisibility(
recyclerView: RecyclerView,
container: FrameLayout,
arrow: ImageView
) {
// Pfeilrichtung umschalten, auch Benutzerklicks blockieren, bis die Animation beendet ist.
arrow
.animate()
.rotation(
if (arrow.rotation == 0F)
180F
else 0F
)
.withStartAction { container.isClickable = false }
.withEndAction { container.isClickable = true }
.start()
// Umschalten der RecyclerView-Sichtbarkeit mit Animation.
with(recyclerView) {
var cof = -1
var vis = View.GONE
var alph = 0F
if (visibility == View.GONE) {
cof = 0
vis = View.VISIBLE
alph = 1F
}
animate()
.translationY(height.toFloat() * cof)
.alpha(alph)
.withStartAction {// Im Falle des Anzeigens der RecyclerView am Anfang anzeigen.
if (vis == View.VISIBLE)
visibility = View.VISIBLE
}
.withEndAction {// Im Falle des Ausblendens der RecyclerView am Ende ausblenden.
if (vis == View.GONE)
visibility = View.GONE
}
.start()
}
}
Die Ansichten sehen so aus
dann fügst du in deinem Code zuerst diese Zeile hinzu, die das Problem löst, dass animateLayoutChanges
nicht in großen verschachtelten Ansichten funktioniert, was im Grunde andere Ansichten glatt nach oben bewegt, wenn die RecyclerView ausgeblendet wird
subRootLinearView.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
auch sollte dein übergeordneter LinearLayout dieses Attribut enthalten
android:animateLayoutChanges="true"
dann rufe die Methode mit deinen Ansichten auf
toggleRecyclerViewVisibility(
recycler,
header,
arrowImageView
)