Korrekter Weg, onMeasure () und onLayout () in benutzerdefinierter AdapterView zu implementieren

8

Ich weiß, dass ich Kinder in onMeasure() messen und sie in onLayout() anordnen soll. Die Frage ist in welcher dieser Methoden sollte ich Ansichten hinzufügen / recyceln, so dass ich alle Kinder zusammen mit einem Auge auf, wie sie gegenseitig (d. H. Gitter, Liste oder was auch immer) messen könnten?

Mein erster Ansatz war das Hinzufügen / Recyclen von Ansichten in onLayout() . Ab diesem Zeitpunkt kann ich meine Kinder nicht mehr messen, da sie noch nicht zu AdapterView hinzugefügt wurden und getChildCount() gibt 0 in onMeasure() zurück. Und ich kann AdapterView selbst nicht messen, ohne dass die Kinder bereits layouted sind, weil es wirklich von ihren gegenseitigen Positionen abhängt, oder?

Ich bin wirklich verwirrt mit Android Layout-Prozess in AdapterView, wenn Kinder dynamisch hinzugefügt / entfernt werden.

    
vganin 19.07.2015, 12:16
quelle

1 Antwort

1

Ich kann keinen Kommentar posten, weil ich ein neuer Benutzer bin. Aber kannst du beschreiben, WAS du versuchst zu tun, anstatt wie du es versuchst? Häufig werden Sie feststellen, dass dies im Gegensatz zur Codierung ein Problem des Designs ist. Vor allem, wenn Sie von einer anderen Plattform kommen (zB iOS). Aus Erfahrung habe ich festgestellt, dass Messungen und manuelle Layouts in Android meist unnötig sind, wenn Sie Ihr Layout entsprechend Ihren Geschäftsanforderungen richtig gestalten.

BEARBEITEN: Wie ich bereits erwähnt habe, kann dies mit einigen Designentscheidungen gelöst werden. Ich werde Ihr Nodes / List-Beispiel verwenden (in der Hoffnung, dass dies Ihr tatsächlicher Anwendungsfall ist, aber die Lösung kann für ein allgemeineres Problem erweitert werden).

Wenn wir also Ihren Header als Kommentar in einem Forum und die Liste als Antworten auf Ihren Kommentar betrachten, können wir folgende Annahme machen:

  1. Eine Liste ist genug, nicht zwei. Jeder Eintrag in der Liste kann entweder ein Header (Kommentar) oder ein Listeneintrag (Antwort) sein. Jede Antwort ist ein Kommentar, aber nicht alle Kommentare sind Antworten.

  2. Bei Artikel n weiß ich, ob es sich um einen Kommentar oder eine Antwort handelt (d. h. um eine Kopfzeile oder ein Element in Ihrer Liste).

  3. Für Element n habe ich ein boolesches Element isVisible (Standard false; View.GONE).

Sie können jetzt die folgenden Komponenten verwenden:

  1. Eine erweiterte Adapterklasse
  2. Zwei Layout-XMLs: Eine für Ihren Kommentar, eine für Ihre Antwort. Sie können unbegrenzte Kommentare haben und jeder Kommentar kann unbegrenzte Antworten haben. Beide erfüllen Ihre Anforderungen.
  3. Ihre Fragment- oder Aktivitätscontainer-Klasse, die OnItemClickListener zum Anzeigen / Verbergen Ihrer Liste implementiert.

Sehen wir uns also einen Code an, oder?

Zuerst Ihre XML-Dateien:

Kommentarzeile (Ihre Überschrift)

%Vor%

Jetzt Ihre Antwortzeile (ein Element in Ihrer Liste)

%Vor%

Ok, jetzt deine Adapterklasse

%Vor%

Ok, jetzt haben wir eine Liste von Kopfzeilen mit versteckten Kindern (denken Sie daran, wir setzen die Standardsichtbarkeit von Kindern auf 'weg'). Nicht was wir wollten, also lasst uns das reparieren.

Ihre Containerklasse (Fragment oder Aktivität) haben Sie die folgende XML-Definition

%Vor%

Und Ihre onCreateView implementiert OnItemClickListener und haben die folgenden

%Vor%

Nun, um Ihre Liste anzuzeigen, wenn Sie auf eine Kopfzeile klicken

%Vor%

Wenn nun auf ein Element geklickt wird und dieses Element ein Elternelement (d. h. ein Listenelement) hat, wird es entsprechend seinem aktuellen Status angezeigt / verborgen.

Einige Kommentare zum Code:

  1. Ich habe dies auf WordPad geschrieben, da ich keine Entwicklungsumgebung zur Hand habe. Entschuldigung für irgendwelche Kompilierungsfehler.

  2. Dieser Code kann optimiert werden: Wenn Sie einen sehr großen Datensatz haben, ist dieser Code langsam, da Sie die gesamte Liste bei jedem Aufruf von changeVisibility () neu zeichnen. Sie können zwei Listen verwalten (eine für Kopfzeilen, eine für Listenelemente) und in changeVisibility können Sie nur die Listenelemente abfragen.)

  3. Ich bekräftige die Idee, dass einige Designentscheidungen Ihr Leben sehr erleichtern würden. Wenn Ihre Listenelemente beispielsweise nur eine Liste von Labels sind, können Sie eine benutzerdefinierte XML-Datei (für Ihre Kopfzeile) und eine darin enthaltene ListView-Ansicht verwenden, die Sie auf View.GONE setzen können. Dadurch werden alle anderen Ansichten so aussehen, als wären sie nicht vorhanden und Ihr Layout funktioniert ordnungsgemäß.

Hoffe, das hilft.

    
Fayez 11.08.2015 04:07
quelle