2009-04-16 4 views
3

Ich schreibe einen Adobe Air-Client für einen Dienst, der dem von Twitter ähnelt.Erneutes Messen des benutzerdefinierten Elementrenderers in einer Liste

auf der Timeline (List-Komponente) Ich habe einen benutzerdefinierten Elementrenderer, die im Grunde eine Leinwand mit einer mit fester Breite Bild und einem Text-Control ist, die mit mehreren Leitungen ist.

Wenn der Text lang genug ist, um die Leinwand Höhe zu ändern, wird es nur geändert werden, wenn ich manuell die Breite des Fensters ändern, ein erneutes Zeichnen aller Renderer zwingt. Wenn ich einfach durch die Liste scrolle, haben alle "neuen" Renderer die minimal mögliche Höhe (das ist die Bildhöhe).

Alle Ideen, wie die erneute Messung des Renderers zu erzwingen, wenn ich es Datensatz?

Vielen Dank im Voraus! :)

Antwort

0

try Aufruf invalidateSize() auf dem itemrender und/oder invalidateDisplayList() auf der Liste

+0

Ich habe versucht, das schon. Kein Erfolg. – leolobato

+0

Ich erinnere mich, mit etwas Ähnlichem zu kämpfen, aber ich kann den Code nicht finden. Versuchen Sie, invalidateDisplayList() in einem anderen Frame mit der CallLater-Funktion aufzurufen. Sie könnten auch validateNow() versuchen. Entschuldigung, ich kann Ihnen keine spezifische Lösung geben. – rogueg

0

Versuchen Sie variableRowHeight=true für die Liste Einstellung?

+0

tat ich. Es ändert sich korrekt, wenn ich die Fensterbreite ändere.Ich möchte nur, dass es neu berechnet und korrekt skaliert wird, wenn ich die Liste scrolle. – leolobato

+0

Wie wird die Höhe von Leinwand und Text auf 100% gesetzt? – Amarghosh

0

Wenn Sie das updateComplete-Ereignis behandeln, können Sie dort die Größe neu berechnen. Es ist wahrscheinlich über Kill, da updateComplete jedes Mal ausgeführt wird, wenn der itemrenderer gezeichnet wird, aber es funktioniert.

0

Zuerst müssen Sie variableRowHeight auf True setzen;
In Ihrem itemRenderer Sie verticalScrollPolicy ausgeschaltet werden soll (i annehmen, dass Sie bereits getan haben), und tun auch gleich mit dem Textfeld. Stellen Sie auch die Höhe des Textes auf 100% ein.
Ich habe es nicht in Flex4 versucht, aber in früheren Versionen musste ich eine VBox als root für die itemRenderer haben, um es basierend auf seinem Text Inhalt Größe zu ändern, sollten Sie eine VBox/VGroup Instanz anstelle von Canvas verwenden.

0

Ich stieß auf ein sehr ähnliches Problem mit Größenanpassung Elementrenderer in einem Datenraster mit Etiketten, die sich basierend auf Text Größe müssen. Das Problem besteht darin, dass zwei Durchläufe erforderlich sind, damit sich eine mehrzeilige Textkomponente korrekt selbst aktualisiert. Dies funktioniert für die meisten Steuerelemente, da sie ständig aktualisiert und positioniert werden. Es schlägt in einer Liste oder einem Grid fehl, da die erste Aktualisierung bei einer Änderung die Liste zwingt, die Elementrenderer zu messen, und dann die Höhe ihrer Zeile basierend auf dem zurückgegebenen Ergebnis festlegt. Der Elementrenderer aktualisiert sich dann beim zweiten Mal (diesmal korrekt gemessen), aber die Liste sucht nicht nach diesen Updateänderungen. Ich habe gewaltsam das Label (Textkontrolle) im Measure Pass überprüft, um die Textkomponente richtig zu skalieren, so dass der Renderer die korrekte gemessene Höhe beim ersten Update-Pass nach jeder Änderung meldet. Mein questing (und mein späterer entdeckt Anser und einig Diskussion) ist hier: ItemRenderer hieght (and height changes) not reflected in AdvancedDataGrid row