ListView und Elemente mit variabler Höhe verursachen Bildlaufprobleme

8

Ich habe eine ListView , mit der ich eine Liste von Feldern, einem Text und einem Foto durchblättern kann. Beide Höhen sind dynamisch : Die Textansicht kann einen sehr langen Absatz oder nur einen Satz enthalten, und das Bild wird auf die Breite skaliert, sodass die Höhe variabel ist (Sie können das Foto sehen). Einige Gegenstände haben sogar kein Bild. Dies macht die Gegenstände sehr heterogen in der Höhe. Es gibt ein Element, das 2 Bildschirme lang sein kann, während ein anderes nur eine Textzeile enthält.

Ich habe es funktioniert etc .. aber wenn ich nach oben scrollen, wie Recycling-Ansichten an der Spitze eingefügt werden, springt die Scroll-Position in etwa die Größe des neuen Kindes. Nach unten scrollen funktioniert perfekt ...

Ich verstehe mehr oder weniger, warum offensichtlich die wiederverwerteten Ansichten in der Größe total verschieden sind, und das lässt einige scrollende Algorithmen scheitern, wo immer sie auch sein mögen.

Ich habe gelesen, dass itemType() und itemTypeCount überschrieben wurden, aber ich weiß nicht, ob es mit meinem Problem zu tun hat. Bei den Tests, die ich gemacht habe, funktionierte das nicht (magisch).

Kann dies leicht behoben werden, irgendein Trick oder magische AnfrageLayout hier und dort?

Es gibt einen Typen, der vorschlägt, einen View-Recycler zu schreiben, um das Problem zu beheben: Frage Listenansicht scrollt ziemlich junky, wenn therre verschiedene Zeilenhöhen sind

Würde ein View recycler so schrecklich kompliziert geschrieben, wie es klingt?

Entschuldigung für die abstrakte Frage ..

    
rupps 16.12.2013, 03:27
quelle

3 Antworten

4

Merken Sie sich nur die Höhe von ImageView und TextView, und wenn Ihre Ansichten wiederverwendet werden, legen Sie die Höhe für diese Ansichten mit der Methode getView in Ihrem ListAdapter fest (Sie müssen BaseAdapter dafür erweitern).

Sie haben also eine Liste von Objekten mit Ihren Daten (etwas Text, vielleicht eine Bild-URL, usw.). Fügen Sie ein ganzzahliges Feld namens imageHeight hinzu. Wenn Sie das Bild für ein Listenelement zum ersten Mal laden, speichern Sie die Höhe von ImageView in diesem Ganzzahlfeld in dem Datenobjekt, das diesem Listenelement zugeordnet ist. Stellen Sie dann in getView in Ihrem ListAdapter die Höhe von ImageView auf den Wert von imageHeight ein.

Damit bringt Ihr Adapter eine Ansicht mit der richtigen Höhe zurück. Das funktioniert natürlich nur, wenn Sie die Höhe des Bildes / Textes, das Sie laden wollen, bereits kennen. Dies gilt, wenn Sie nach oben scrollen, da diese Elemente bereits geladen wurden.

    
Hassan 29.05.2014 07:12
quelle
1

Versuchen Sie, die Bilder (in WeakHashMap) in getView zwischenzuspeichern, und dann muss das Bild nach oben nicht erneut geladen werden, was die Neuberechnung der hässlichen Höhe zur Folge hat ...

    
xnagyg 07.05.2015 13:24
quelle
-5

Verwenden Sie nicht die convertView der Methode getView (int-Position, View convertView, ViewGroup-Parent).

Sie müssen die Zeile jedesmal aufblasen, wenn getView aufgerufen wird. Es wird das Scrollen etwas langsam machen, aber Ihr Problem wird gelöst.

    
Abhishek Akhani 16.12.2013 04:50
quelle