6

Ich entwickle eine Android-App, in der ich zwei verschiedene Arten von Informationen über 'FirebaseDatabase' speichere.Wie setze ich zwei Adapter auf einen RecyclerView?

Dann in der MainActivity, ich bin Abrufen von ihnen und zeigt Benutzern in einer RecyclerView. Beide Informationen sollen in verschiedenen Layouts gezeigt werden, d. H. Die Layouts für beide sind unterschiedlich und deshalb habe ich zwei verschiedene Model-Klassen und zwei verschiedene Adapter. Ich verwende FastAdapter von @MikePenz

Also, was ich tat, ist ich den Adapter auf recyclerview in der gleichen Reihenfolge wie die Informationen, eingestellt wird abgerufen aus Datenbank:

1.

public void prepareDataOfSRequests() { 
     gModelClass = new GModelClass(postedBy, ***, ***, ***, "error", ***, formattedTime, currentLatitude, currentLongitude, utcFormatDateTime, userEmail, userID, null, ***, itemID); 
     fastItemAdapter.add(0, gModelClass); 
     recyclerView.setAdapter(fastItemAdapter); 
     recyclerView.smoothScrollToPosition(0); 
     emptyRVtext.setVisibility(View.INVISIBLE); 
    } 
.
public void prepareDataOfERequests() { 
     eModelClass = new EModelClass(***, ***, ***, ***, "error", ***, formattedTimeE, currentLatitudeE, currentLongitudeE, utcFormatDateTimeE, userEmailE, userIDE, null, ***, ***, ***, ***, itemID); 
     fastItemAdapterER.add(eventRequestsModelClass); 
     recyclerView.setAdapter(fastItemAdapterER); 
     recyclerView.smoothScrollToPosition(0); 
     emptyRVtext.setVisibility(View.INVISIBLE); 
    } 

als recyclerview einzige ist, und ich bin Einstellung 2 verschiedene Adapter eins nach dem anderen wird die recyclerview mit dem zweiten Adapter immer aktualisiert und zeigt nur Sein Inhalt.

Also, wie kann ich zeigen oder legen Sie beide den Adapter auf die gleiche 'RecyclerView' und kann den Inhalt in beiden Adaptern gespeichert anzeigen.

+0

Sie zwei Arten von viewholder tun können, und eine Schnittstelle fragen ... wenn Artikel ist instanceOf Class1 sonst viewholder2 – JCDecary

+0

ziehen viewholder1 @ JCDecary, aber ich muss beide in der Recycleransicht zeigen. Ich denke, dass dein Code einen zeigt. Recht? –

+0

nein, du wirst beide haben, musst du getitemcount überschreiben – JCDecary

Antwort

11

Sie können zwei Adapter in einem RecyclerView nicht einstellen. Sie können jedoch einen benutzerdefinierten Adapter erstellen, der zwei Arten von Elementen verarbeitet. Hier ist, wie:

Nehmen wir an, Sie Objekte von zwei Typen A nimals und B everages angezeigt werden müssen. Lassen Sie uns das härteste Szenario behandeln, das heißt, Ihre Objekte benötigen völlig unterschiedliche Layouts, um sie anzuzeigen und völlig anders zu sein ViewHolders. Hier sind die ViewHolders:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    ... 
    private static class AnimalViewHolder extends RecyclerView.ViewHolder { 
     public AnimalViewHolder(View itemView) { 
      super(itemView); 

      // prepare your ViewHolder 
     } 

     public void bind(Animal animal) { 
      // display your object 
     } 
    } 

    private static class BeverageViewHolder extends RecyclerView.ViewHolder { 
     // like the one above 
     ... 
    } 
} 

Zuerst Konstanten zu Ihrem Adapter fügen Sie Ihre Ansicht Arten darstellen:

private static final int ITEM_TYPE_ANIMAL; 
private static final int ITEM_TYPE_BEVERAGE; 

Aus Gründen der Einfachheit lässt annehmen, dass Sie speichern Sie Ihre Objekte in einer Liste:

private List<Object> items = new ArrayList<>(); 

public MyAdapter(List<Object> items) { 
    this.items.addAll(items); 
    ... 
} 

Zuerst müssen Sie implementieren :

@Override 
public int getItemViewType(int position) { 
    if (items.get(position) instanceof Animal) { 
     return ITEM_TYPE_ANIMAL; 
    } else { 
     return ITEM_TYPE_BEVERAGE; 
    } 
} 

Nächstes verwenden Sie den Elementtyp innerhalb onCreateViewHolder:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 

    if (viewType == ITEM_TYPE_ANIMAL) { 
     layoutInflater.inflate(R.layout.item_animal, parent, false); 

     return new AnimalViewHolder(view); 
    } else {  
     layoutInflater.inflate(R.layout.item_beverage, parent, false); 

     return new BeverageViewHolder(view); 
    } 
} 

Schließlich binden Sie die richtige Ansicht Halter:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    Object item = items.get(position); 

    if (viewHolder instanceof AnimalViewHolder) { 
     ((AnimalViewHolder) viewHolder).bind((Animal) item); 
    } else { 
     ((BeverageViewHolder) viewHolder).bind((Beverage) item); 
    } 
} 
+0

Sie könnten einfach Ihre Layout-Ressource IDs innerhalb der 'getItemViewType' zurückgeben. Und dann in "onCreateViewHolder" einfach "viewType" im Methodenparameter aufblasen. –

+0

Sie könnten, aber dieser Trick erreicht sein volles Potenzial nur, wenn Sie denselben ViewHolder für beide Layouts verwenden. Ansonsten bleibst du bei if-elses in create und bind und der Gewinn ist minimal. –

0

Wenn Sie möchten, Sie auf jeden Fall eine mittlere Schicht mehrere Adapter akzeptieren schreiben kann.

Sie können einen Blick darauf werfen, was ich tun, wenn Sie interessiert sind. https://github.com/Jintin/MixAdapter

Verwandte Themen