Einwickeln Was ichHorizontal RecyclerView mit variabler Artikel Höhen nicht richtig
Der Artikel Blick über die gesamte Höhe des Elements besetzen sollte
Es könnte zu erreichen beabsichtigen Sei es, dass die Artikelhöhe kleiner ist als die Höhe des höchsten Artikels in der Recycleransicht, in diesem Fall sollte es einfach oben bleiben im Screenshot oben.
Der Fehler ich in laufen
Wie in der Abbildung oben sind Ansichten, abgeschnitten zu werden.
Was ich versucht habe bisher
Zunächst ging ich mit wrap_content auf dem recyclerview, jetzt, dass es unterstützt wird. Es funktionierte nicht, wenn keine der auf dem Bildschirm zu dieser Zeit sichtbaren Ansichten die höchsten war. Dies macht Sinn für die Anordnung der Ansichtshierarchie. Wie kann die Höhe von etwas, das noch nicht an irgendwelche Daten gebunden ist, berechnet werden, wenn die Höhe von diesen Daten abhängt?
Behelfslösung Zeit: S
Statt ein benutzerdefinierten Layoutmanager versucht, ging ich zuerst mit dem, was ich fühlte mich getan werden müssen - alle Artikelansichten zu Beginn Auslegen ihre Höhe, um herauszufinden.
Es gibt eine Fortschrittsleiste und eine Animation, die im oberen Teil des Bildschirms angezeigt wird, um die Aufmerksamkeit des Benutzers zu erregen, während all dies geschieht und die Sichtbarkeit von recycleview auf unsichtbar gesetzt ist. Ich benutze zwei Dinge, eines hat nicht genügt - ich habe einen Beobachter in den Adapter onViewAttached()
Anruf angeschlossen und ich habe auch einen Scroll-Change-Listener verwendet. Es gibt einen LinearSnapHelper, der an die Recycler-Ansicht angehängt ist, um an der nächsten (nächsten oder vorherigen, je nach Scroll-Richtung) Position beim Scrollen zu fangen.
In diesem Setup
- Ich bin in der recyclerview jeder Position gehen
layoutManager.smoothScrollToPosition()
Erste das Kind Blick Höhe
View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition()); if (currentChildView != null) { currentChildHeight = currentChildView.getHeight(); }
in scroll ändern Listener mit auf RecyclerView.SCROLL_STATE_IDLE
oder indem Sie die Höhe zu dem oben genannten Observer beigefügt im Adapter onVie wAttachedToWindow()
@Override
public void onViewAttachedToWindow(BindingViewHolder holder) {
if (mObserver != null) {
mObserver.onViewAttached(holder.binding.getRoot().getHeight());
}
}
- ein
maxHeight
Speicher, die das Maximum von maxHeight und neuer Kindergröße ändert.
Wie offensichtlich ist, ist dies hässlich. Außerdem gibt es mir nicht die aktuelle Ansichtshöhe - onAttached bedeutet, dass es nur gerade angebracht, nicht gemessen und ausgelegt ist. Es ist die wiederverwendbare Ansicht, nicht die Ansicht, die an das aktuelle Datenelement gebunden ist. Das stellt Probleme wie das oben abgebildete Abschneiden der Ansicht dar.
Ich habe auch wrap_content Höhe auf der Recycler Ansicht versucht und bis zum Recycler von Recycler der Eltern ungültig zu machen und das Kind auf Blättern zu SCROLL_STATE_IDLE kommen. Funktioniert nicht.
Ich bin mir nicht sicher, wie ein benutzerdefinierter Layoutmanager hier helfen kann.
Kann mir jemand die richtige Richtung zeigen?
können Sie Ihre XML-Datei – Redman
finden Sie es [hier] (https://gist.github.com/adroitandroid/85e7a66d7f796379649c2d9eab26cf76) –
Die recyclerview in Frage ist die, mit der ID "next_rv" hinzufügen.Eigentlich für die oben beschriebene Lösung, zunächst habe ich es auf Höhe match_parent gesetzt und später die Höhe auf die 'maxHeight' zurückgesetzt –