Kann onMeasure beim Hinzufügen einer View zu einer ViewGroup übersprungen werden?

9

Beantwortet

Ich habe ein RelativeLayout, in dem ich Ansichten dynamisch hinzufüge, während der Benutzer vertikal oder horizontal scrollt. Ich habe meinen eigenen ViewRecycler gerollt, da es potenziell tausende von Ansichten gibt, die das Ganze zusammensetzen können, was gescrollt werden kann, aber ich zeige nur 30 oder so zu jeder Zeit. Stellen Sie sich eine vergrößerte Ansicht eines Kalenders vor.

Ich stoße auf Leistungsprobleme, wenn ich die Ansichten hinzufüge, die bald gesehen werden, onMeasure wird auf der RelativeLayout-Kaskadierung aufgerufen, bis onMeasure in allen untergeordneten Ansichten aufgerufen wird. Ich habe bereits die berechnete Größe, wie groß das RelativeLayout jemals sein wird, und habe es auf seine LayoutParameters gesetzt, also ist das Messen der ViewGroup nicht notwendig, noch werden die bereits hinzugefügten Views mit ihrer endgültigen Größe neu berechnet Die hinzugefügte Ansicht hat keinen Einfluss auf diese Ansicht.

Das einfache Beispiel, um das Problem zu demonstrieren, ist das Hinzufügen / Entfernen eines Views zu einem RelativeLayout und das Anschauen von onMeasure, obwohl die RelativeLayout-Größe oder die Position anderer Views nicht beeinflusst wird.

main.xml

%Vor%

MyActivity.java

%Vor%

Wenn Sie dies ausführen, sehen Sie 2 erste (erwartete) Aufrufe von onMeasure, dann eine für jedes Mal, wenn Sie die Ansicht hinzufügen / entfernen, indem Sie auf die Schaltfläche klicken. Dies funktioniert natürlich gut, aber Sie können sehen, wo konstante Aufrufe von onMeasure, wenn Sie ein komplexes Layout verschachtelter Ansichten haben, problematisch werden können.

Gibt es eine empfohlene Möglichkeit, diese onMeasure-Aufrufe oder zumindest onMeasure, die measureChildren aufrufen, zu umgehen?

    
Kelly Merrell 09.06.2011, 20:26
quelle

3 Antworten

0

Anstatt meinen eigenen Layout-Manager zu rollen (was ich vielleicht in Zukunft noch tun werde), habe ich onMeasure in:

geändert %Vor%

... und fügte eine sudo-hard codierte Höhe und Breite für den Container als Variable hinzu. Die Einstellung auf das, was Sie erwarten, liegt außerhalb des Anwendungsbereichs dieser Lösung.

%Vor%     
Kelly Merrell 05.08.2011, 18:43
quelle
0

Ich stieß auf ein ähnliches Problem, wenn die Animation auf der Größe der Viewgroup basiert, deren onMeasure () sehr häufig aufgerufen wird. Da die übergeordnete Ansicht zahlreiche untergeordnete Ansichten enthält, führten die häufigen kaskadierten onMeasure () - Aufrufe zu Problemen bei der Animationsleistung. Ich habe eine andere schmutzige Lösung aber viel einfacher als das Ausrollen meines eigenen LayoutManager.

%Vor%     
Chen Zhang 17.09.2011 12:15
quelle
0

Ich habe ein ähnliches Problem festgestellt und meine Lösung bestand darin, zu überprüfen, ob sich die Abmessungen geändert haben:

%Vor%

Wenn sich also die Dimensionen des Elternteils nicht wirklich ändern, wird er nicht auf seine untergeordneten Elemente heruntergeschaltet.

    
Frank L 08.11.2011 23:34
quelle

Tags und Links