Erhalte Breite von CardView in Adapter.onBindViewHolder

8

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%     
Andrew 28.10.2014, 10:34
quelle

2 Antworten

7

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.

    
yigit 28.10.2014, 22:46
quelle
0

Sie können Picasso Transformation verwenden, um dies zu erreichen.

FitToTargetViewTransformation-Klasse:

%Vor%

Und irgendwo in onBindViewHolder tun Sie etwas wie folgt:

%Vor%     
localhost 28.10.2014 10:38
quelle