-1

Ich weiß, es ist eine schlechte Idee, aber ich benutze ein RecyclerView in einem anderen RecyclerView-Element, um eine Liste von Elementen anzuzeigen, die eine Liste enthalten.RecyclerView in einem RecyclerView item

Ich schaffte es, es zu arbeiten und zwickte es so weit wie ich konnte, aber ich bekomme immer noch diese green Spitzen, wenn Listen mit einer größeren Anzahl von Elementen beginnen zu zeigen und werden auf dem Bildschirm gezeichnet.

GPU profiling Samsung Galaxy S6

Those Spitzen erzeugen eine merkliche Verzögerung, wenn sie durch Gegenstände schleudern und sind noch deutlicher, wenn etwas langsamer und älter als Samsung Galaxy S6 verwendet wird.

Ich habe einige Protokollierung und es scheint, dass die outer ViewHolders recycelt werden und die inner RecyclerView des Adapters ist nur 5 Mal erstellt, so dass es die Zeichenzeit, die die Leistung tötet sein muss.

Ich habe es geschafft, die Erstellung von neuen inner RecyclerViews ViewHolders zu begrenzen, indem ich die maximale Anzahl von ViewHolders im RecycledViewPool einstellte, aber das half nur ein wenig.

Ich weiß, dass das innere RecyclerView kein "bottom" hat, auf dem es sich verlassen konnte, um zu berechnen, wann neue Elemente zu zeigen, so dass es jedes Element sofort zeichnen muss, und das ist wahrscheinlich der Hauptgrund, warum man nicht sollte Verwenden Sie dieses Setup. (Ich komme zu meiner Sinnen, als ich diese Frage schreibe .. danke Gummienten der Welt).

Gibt es eine Möglichkeit, dies noch weiter zu optimieren oder können Sie vorschlagen, wie dies funktioniert mit einem anderen Setup als RecyclerView in einem anderen RecyclerView-Element?

Ich werde bei Bedarf weitere Informationen zur Verfügung stellen.

Danke

+0

Was möchten Sie erreichen? – Stefan

+1

Bitte stimmen Sie die Frage nicht ab ... bevor Sie dem Fragesteller einen Vorschlag unterbreiten. –

+0

versuchen, eine Idee zu bekommen, was als nächstes zu tun ist, um dieses Setup reibungslos zu machen, ohne zu verzögern oder Frames beim Schleudern fallen – rexxar

Antwort

2

Die beste Lösung ist entweder auf einen ListView zurück zu schalten und verwenden Sie die ExpandableListViewinterface, oder es selbst zu implementieren auf RecyclerView.

Wie Sie erwähnt haben - Auflistung von Scroll-Komponenten ist nie eine gute Lösung. Hier ist ein Beispiel erweiterbare Liste Ansicht Adapter, so dass Sie eine Idee, was erforderlich wäre:

public class MyExpandableListAdapter extends BaseExpandableListAdapter { 

    ... 

    @Override 
    public Object getChild(int listPosition, int childListPosition) { 
     //return an item that would have been in one of the nested recyclers 
     //(listPosition = parent, childListPosition = nested item number) 
     return getGroup(listPosition).getChildren().get(childListPosition); 
    } 

    @Override 
    public int getChildrenCount(int listPosition) { 
     //presuming the parent items contain the children 
     return getGroup(listPosition).getChildren().size(); 
    } 

    @Override 
    public Object getGroup(int listPosition) { 
     //group is the parent items (the tope level recycler view items) 
     return mData.get(listPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return mData.size(); 
    } 

    @Override 
    public View getGroupView(int listPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item, parent, false); 
     } 
     MyDataType item = getGroup(listPosition); 
     //set the fields (or better yet, use viewholder pattern) 
     return convertView; 
    } 

    @Override 
    public View getChildView(int listPosition, final int expandedListPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item, parent, false); 
     } 
     MyDataType item = getChild(listPosition, expandedListPosition); 
     //set the fields (or better yet, use viewholder pattern) 
     return convertView; 
    } 

} 
+0

danke, ich werde es überprüfen und versuchen, es zu implementieren. Ich glaubte, dass die Tage von ListView vorbei sind und dass der RecyclerView ein Muss und ein Overlord von Listenansichten ist, aber jetzt sehe ich, dass es am besten funktioniert, wenn Sie nicht versuchen, mit ihm zu viel zu tun – rexxar

+1

RecyclerView behoben einige Probleme mit ListView aber Für einen Fall mit untergeordneten Elementen führt ExpandableListView immer noch einen Großteil der Arbeit aus, die Sie in RecyclerView selbst ausführen müssten. Wenn Sie sicherstellen, dass das ViewHolder-Muster verwendet wird und Sie nur eine vertikale Liste verwenden, ist die Verwendung der Listenansicht kein Problem –

-1

ich es geschafft, eine bessere Leistung zu erhalten, indem eine gemeinsame RecycledViewPool zu schaffen, wie es in einem Projekt @Raghunandan in den Kommentaren verknüpft getan wurde .

Google I/O Android App - Shared RecycledViewsPool

ich auch die maximale Anzahl der Ansichten zu diesem Pool gesetzt, die wirklich den Trick, jetzt muß ich nur noch einen Weg finden, um meine Zuhörer wieder verwenden und vermeiden Sie neue zu schaffen, aber das ist eine andere Frage.

Vielen Dank für Ihre Antwort. Ich werde mehr veröffentlichen, wenn ich in der Zukunft etwas Nützliches finde.

Verwandte Themen