2016-04-11 8 views
0

Dies ist ein sehr spezifischer Fall, also werde ich mein Bestes versuchen, diese Frage angemessen zu organisieren. Ich habe eine benutzerdefinierte ViewGroup, die für meinen Zweck funktioniert, aber es Initialisieren verursacht übersprungene Frames.Android welche ViewGroup zu verwenden

Meine App enthält eine ViewPager von Fragment 's, wobei der übergeordnete Container zu jedem ein ScrollView ist. Innerhalb dieser habe ich viele verschiedene Ansichten, eine ist eine LinearLayout enthält vertikale Reihen von benutzerdefinierten Ansichten (um einen Datensatz zu manipulieren). Siehe Bild ‚den Vordergrund, Visible, Secondary apps‘

für dieses Layout, ich habe LinearLayout erweitert und jeder wird zur Laufzeit bevölkert, jedes Kind von xml aufpumpen.

Es funktioniert gut, das Problem ist, dass das Aufblasen all dieser untergeordneten Ansichten zur Laufzeit übersprungene Frames verursacht. Ich habe Methode verfolgt, um zu finden, dass jeder Anruf zu LayoutInflater.inflate() dauert durchschnittlich 4-6 ms. Zwischen all meinen Fragmenten, die jeweils 1 oder mehr dieser Listen enthalten, addiert sie sich beim Start zu einer signifikanten Menge (40-50) übersprungener Frames.

Manuelles Erstellen von Kindansichten statt Aufblasen verbessert es ein wenig, aber nicht genug. Immer noch sehr auffälliges Frame-Skipping.

Es benötigt eine Art der Ansicht Wiederverwendung, ähnlich wie eine ListView tut.

Ich sehe eine Lösung, obwohl es überhaupt nicht ideal erscheint. Das Ersetzen des Fragmentcontainers ScrollView durch eine ListView mit mehreren Ansichtstypen.

Einige Probleme, die ich mit diesem zu sehen sind

  • Es wäre zwischen den Ansichten über, unter und zwischen diesen Listen bis zu 5-6 verschiedene Ansichtstypen erfordern. Scheint sehr unordentlich zu schreiben.
  • Jede untergeordnete Ansicht benötigt die Möglichkeit, die Größe mit einer einfachen Expand/Collapse-Animation vertikal zu erweitern. Nicht sicher, ob dies mit ListView Reihen überhaupt möglich ist.
  • Es beinhaltet fast die gesamte App neu zu schreiben. Was ich gerne mache, möchte ich aber möglichst vermeiden.

Ich fragte mich, ist es überhaupt möglich zu machen:

  • Statt LinearLayout für diese Listen zu verwenden, eine ListView verwenden und seine Größe alle Einzelteile zu zeigen, erweitert werden. Es wäre im übergeordneten ScrollView geschachtelt. Würde es sogar Ansichten wiederverwenden, wenn seine Größe auf alle Elemente erweitert würde?

Gibt es eine andere Art von Container, die ich in diesem Fall verwenden kann? Ich habe das neue RecyclerView noch nicht verwendet, aber von dem, was ich gelesen habe, scheint es im Wesentlichen das gleiche wie ein ListView.

Im Grunde, was ich versuche zu erstellen ist eine LinearLayout, die Ansichten recycelt.

Würde mich über alle Vorschläge freuen. Bitte lassen Sie mich wissen, wenn diese Frage nicht gut liest, kann ich bei Bedarf weitere Informationen oder Postleitzahlen hinzufügen.Ich realisiere, was ich hier zu tun versuche, ist ein bisschen unkonventionell und könnte von vornherein fehlerhaft sein. Aber ich bin sehr zufrieden damit, wie es aktuell präsentiert wird und möchte es so halten.

Antwort

0

Von dem, was ich verstehe, haben Sie anklickbare Titelansichten, die beim Klicken auf ein inneres Layout angezeigt/ausgeblendet werden.

So können Sie Ihre Ansicht ohne die inneren Layouts aufblasen. Nur die anklickbaren Titel. Wenn dann nach dem Anklicken der Titel das entsprechende innere Layout noch nicht aufgeblasen wurde, blähen Sie es auf. Ansonsten zeigst/versteckst du es. Das sollte viel Zeit vor der ersten Inflation sparen. Wenn Sie Ihr Layout programmgesteuert zur Laufzeit erstellen, anstatt ein xml zu inflationieren, sparen Sie auch viel Zeit, da Sie die Methode findViewById(), die ziemlich teuer ist, nicht verwenden müssen.

+0

Großer Vorschlag. Ich werde dies so schnell wie möglich versuchen. –

+0

Wenn es Ihnen mit Ihrer Situation geholfen hat, markieren Sie die Antwort als akzeptiert. – Anonymous

+0

Ich habe immer noch Frame-Skipping davon. Ich hatte einen anderen Gedanken, diese Ansichten im Worker-Thread aufzublasen und an Eltern in 'onPostExecute' anzuhängen. Es funktioniert perfekt auf meinem Gerät, ist etwas falsch daran, es auf diese Weise zu tun? –

Verwandte Themen