Ich habe eine Liste von Posts und die meisten von ihnen sind Bilder (einfach gesagt, es sind Posts wie G + oder FB-Apps). Jeder Post-Eintrag hat ein Bild-Seitenverhältnis, so dass ich die Bildhöhe basierend auf der Breite einstellen kann, noch bevor das Bild vom Server geladen wurde, so dass sich das Karten-Layout beim Laden nicht ändert.
Das Problem ist, dass layout_width="match_parent"
sowohl für das Karten- als auch das Post-Image gesetzt ist. Wenn ich die Breite von Cardview bekomme, ist es Null. Also kann ich die Höhe nicht berechnen.
Im Moment ist die einzige Lösung, die ich sehe, die Breite des übergeordneten Containers (RecyclerView) zu nehmen und alle Paddings abzuziehen, aber es sieht nicht nach einer guten Lösung aus.
Gibt es noch einen anderen Weg?
Hier ist ein Beispiel für den Adaptercode
%Vor%Layouts (ohne irrelevante Teile)
%Vor%includedPost:
%Vor% Wenn onBind
oder onViewAttachedToWindow
aufgerufen wird, ist das Kind noch nicht gemessen, so dass Sie die Breite nicht erhalten können. Selbst wenn diese Anrufe nach der Messung des Kindes durchgeführt werden, ist das, was Sie versuchen, nicht empfehlenswert, da das Ändern der Höhe eine neue Messung erfordert.
Wenn Sie LinearLayoutManager verwenden, wird dem untergeordneten Element die volle Breite zugewiesen (RecyclerView-Füllung und untergeordnete Ränder). Es ist nicht toll, aber OK, um deine Höhe von dort abzuleiten.
Ein anderer (flexiblerer) Ansatz besteht darin, ein benutzerdefiniertes ImageView zu erstellen, das Ihr Seitenverhältnis beibehält. Wenn onBind aufgerufen wird, legen Sie das gewünschte Seitenverhältnis für Ihr benutzerdefiniertes ImageView fest. Wenn ein Takt aufgerufen wird, wird es abhängig von Ihrem Seitenverhältnis gemessen.
%Vor%Also rufen Sie in Ihrer onBind-Methode setScale auf der ImageView auf, abhängig von Ihrem w / h-Verhältnis.
Ich habe nicht getestet, aber dieser Ansatz sollte wie gewünscht funktionieren.
Tags und Links android android-layout android-recyclerview android-cardview