Layout auf ListItem basierend auf ListItem-spezifischer Variable aufblasen

8

Ich verwende SimpleCursorAdapter und ListView , um einige Daten anzuzeigen, die mit einem Loader geladen wurden. Innerhalb der cursor habe ich Objekte mit einem int , das von 0 bis 3 geht.

Ich möchte, dass die Elemente mit diesem int gleich 0-1 ein Layout (rechtsbündig, eine Farbe) und Element mit 2-3 haben, um ein anderes Layout zu haben (linksbündig, eine andere Farbe). much like a chat app, where sent messages are on the right and received ones are on the left.

Gibt es einen einfachen Weg? So etwas wie ein Schalter, bei dem ich mit 0-1 Layout_1 und 2-3 aufblase, lüfte ich layout_2.

BEARBEITEN: Ich habe den Code des ListFragments hinzugefügt, den ich zu füllen versuche. Das Int, das als ein Schalter verwandt wird, ist MyContentProvider.Data.E_TYPE. Ich kann es nicht verstehen, aber vielleicht kann jemand klar erklären, was ich schreiben muss!

%Vor%

EDIT: Wenn ich es richtig gemacht habe, sollte mein finaler EventAdapter (der SimpleCursorAdapter erweitert) wie folgt aussehen:

%Vor%     
David Corsalini 29.08.2012, 14:50
quelle

2 Antworten

10

Es ist wichtig, wenn Sie mit ListViews arbeiten, insbesondere mit komplizierten, wie Sie es beschreiben, um das View Recycling richtig zu handhaben. Die Klasse BaseAdapter , eine Oberklasse von SimpleCursorAdapter , verfügt über einige Methoden, die Sie überschreiben können, um den gewünschten Effekt bei minimalen Ressourcen zu erzielen. Ich habe noch nie einen SimpleCursorAdatper verwendet, daher wurde dies mit einem normalen CursorAdapter geschrieben, aber Sie können dies mit jeder Adapterklasse verwenden, die BaseAdapter überschreibt.

ListViews in Android verhalten sich sehr spezifisch, um die Speicherkosten zu senken. Wenn Sie durch eine ListView blättern, werden die Ansichten für Elemente, die sich vom Bildschirm entfernen, in einem kleinen Pool von Ansichten platziert. Der Parameter convertView wird aus diesem Pool genommen. Sie tun dies, weil die Anzeige von Listenelementen im Arbeitsspeicher nicht gut skaliert wird und schnell zu einer OutOfMemory-Ausnahme führen kann. In der Methode getView() übernehmen Sie diese Ansichten und konfigurieren sie für das aktuelle Listenelement. Normalerweise haben Sie eine Zeile, die folgendermaßen aussieht:

%Vor%

Wenn in diesem Fall convertView nicht null ist, wissen wir, dass es zuvor aufgebläht wurde. Wir möchten sie nicht erneut aufblasen, da dies eine kostspielige Aktion ist und getView die Daten schnell mit Daten füllen sollte, bevor sie angezeigt werden.

Nun, in Ihrem Fall gibt es zwei mögliche Inflationen für convertView. Anstatt die Ansicht jedes Mal neu aufzublasen (sehr schlecht) oder irgendeine Art von Hack mit eindeutigen Ressourcen-IDs für jede Ansicht zu verwenden (besser, aber nicht ideal), können wir zwei Methoden in der Basisklasse überschreiben, um sicherzustellen, dass convertView immer korrekt ist Art. Diese beiden Methoden sind getItemViewCount() und getItemViewType(int position) .

getItemViewCount() wird vom Adapter verwendet, um zu bestimmen, wie viele Pools von Ansichten für die Liste verwaltet werden sollen. Das Überschreiben ist einfach und würde in Ihrem Fall so aussehen.

%Vor%

getItemViewType(int position) wird vom Adapter verwendet, BEVOR getView aufgerufen wird, um zu entscheiden, aus welchem ​​Pool convertView kommen soll. Hier möchten Sie eine switch- oder if / else-Anweisung, die die zugrunde liegende Datenquelle auf ihren Anzeigetyp überprüft und zurückgibt. (Hinweis: Laut der Android-Dokumentation muss der Rückgabewert hier zwischen 0 und getViewTypeCount () -1 liegen, also in Ihrem Fall entweder 0 oder 1.)

%Vor%

Nun werden wir endlich getView modifizieren, um die anfängliche layoutInflation durchzuführen, damit Sie die richtigen Ansichten in Ihren Pools haben.

%Vor%

ListViews und ihre Adapter sind eines der kompliziertesten Dinge, die ich bei Android erlebt habe, aber die richtige Zeit zu nehmen, verbessert die Leistung und Benutzerfreundlichkeit in Ihrer App erheblich. Viel Glück!

    
MattDavis 29.08.2012, 15:55
quelle
0

Ich denke, du musst nur das richtige Layout für deine getView(int position, View convertView, ViewGroup parent) Methode aufblasen:

%Vor%

Haben Sie das gebraucht?

    
AMerle 29.08.2012 15:12
quelle