2016-07-23 26 views
0

Ich habe 2 viewTypes in meinem RecyclerView - A und BHinzufügen von Ansichten RecyclerView dynamisch

A aus Adapter sind Daten erhält. B ist eine benutzerdefinierte Ansicht mit völlig anderem Layout und macht einen eigenen Web-Service-Aufruf für Daten.

Also habe ich 2 ViewHolder insgesamt (eins für A, eins für B). Meine Anforderung besteht darin, B nur anzuzeigen, wenn alle Daten erfolgreich vom Server abgerufen wurden. Also mache ich zunächst die Sichtbarkeit der B-Ansicht auf GONE und setze sie auf VISIBLE zurück, wenn Daten angezeigt werden sollen.

Das Problem mit diesem Ansatz ist, dass Teiler (eingestellt mit ItemDecoration) für B-Ansichten angezeigt werden, selbst wenn der Inhalt GONE ist. Dies verursacht große Lücken in der RecyclerView, während B-Ansichten geladen werden. Wenn sie nicht geladen werden können, entferne ich B-Ansichten, sodass dieser Teil kein Problem darstellt.

Blick auf die ItemDecoration API Ich glaube nicht, dass es eine Möglichkeit gibt, Teiler bedingt anzuzeigen.

So suche ich nach einer Möglichkeit, die B-Ansichten außerhalb von RecyclerView zu erstellen und dann die Ansicht selbst zu RecyclerView hinzuzufügen. Ist es möglich ? Oder gibt es eine bessere Lösung für mein Problem?

Eine mögliche Problemumgehung besteht darin, ItemDecoration zu löschen und stattdessen Ränder zu den Ansichten A und B hinzuzufügen und den Rand von B von 0 auf einen höheren Wert zurückzusetzen, wenn Daten empfangen werden. Ich habe diesen Ansatz nicht getestet, aber ich möchte es vermeiden, weil ich zu viele viewTypes habe (A und B sind nur zwei davon) und die meisten davon sind benutzerdefinierte Ansichten, deren Layout ich ändern muss.

Antwort

0

Ich möchte Ihnen eine allgemeine Liste vorschlagen, von wo Sie Ihre RecyclerView bevölkern werden. Wenn die B-Elemente mit ihren Serviceaufrufen beendet sind, werden sie entsprechend in diese allgemeine Liste eingefügt, und die Änderungen in der Liste können leicht durch den Aufruf von notifyDatasetChanged auf dem Adapter wirksam werden.

Also hier ist eine gemeinsame Klasse, die ich vorschlagen möchte.

public class CommonClass { 
    public ClassA; 
    public ClassB; 
    public ClassC; 

    // .... You can put other classes here as you need to populate all the items in a single list 

    // You can set this tag like "A" to specify this object is a A type object. 
    // This is necessary when you'll populate the items in your list. 
    // You'll check the tag first in your `getView` method and will take actions accordingly after checking the tag. 
    public String tag; 
} 

nun eine Liste der CommonClass nehmen und dann die Einzelteile füllen. Wenn die Web-Service-Anrufe beendet sind, können Sie die Daten in dieser Liste erneut auffüllen und dann notifyDatasetChanged in Ihrer Adapter anrufen.