6

Je développe une application Android dans laquelle je stocke deux types d'informations sur 'FirebaseDatabase`.Comment définir deux adaptateurs sur un RecyclerView?

Puis dans le MainActivity, je les récupère et montre aux utilisateurs dans un RecyclerView. Les deux informations sont censées être montrées dans différentes mises en page, c'est-à-dire, les mises en page pour les deux sont différentes et c'est pourquoi j'ai deux faire deux classes de modèle différentes et maintenant avoir 2 adaptateurs différents. J'utilise FastAdapter par @MikePenz

Alors, ce que je l'ai fait est que je mis l'adaptateur recyclerview dans la même séquence que les informations sont extraites de la base de données:

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); 
    } 

2 .

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); 
    } 

comme recyclerview est seul et que je suis mise en 2 adaptateurs différents, un par un, le recyclerview est mis à jour avec se 2ème adaptateur et ne montrant que c'est du contenu. Donc, comment puis-je afficher ou définir l'adaptateur sur le même 'RecyclerView' et peut montrer le contenu stocké dans les deux adaptateurs.

+0

vous pouvez faire deux types de viewholder et demander une interface ... si l'article est instanceOf CLASS1 dessiner viewholder1 autrement viewholder2 – JCDecary

+0

@ JCDecary mais je dois les montrer tous les deux dans le recyclerview. Je pense que votre code montrera l'un ou l'autre. Droite? –

+0

non vous aurez tous les deux vous juste devez remplacer getitemcount – JCDecary

Répondre

11

Vous ne pouvez pas définir deux cartes sur un seul RecyclerView. Cependant, vous pouvez créer un adaptateur personnalisé qui gère deux types d'éléments. Voici comment:

Supposons que vous avez besoin d'afficher des objets de deux types A NIMAUX et B everages. Manipulons le scénario le plus difficile, c'est-à-dire que vos objets nécessitent des mises en page complètement différentes pour les afficher et complètement différentes ViewHolders. Voici les 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 
     ... 
    } 
} 

D'abord, vous ajoutez des constantes à votre adaptateur représentant vos types de vue:

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

Par souci de simplicité permet de supposer que vous stockez vos objets dans une liste:

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

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

D'abord vous devez mettre en œuvre getItemViewType:

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

Ensuite, vous utilisez le type d'élément à l'intérieur 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); 
    } 
} 

Enfin, vous lient support approprié de vue:

@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

Vous pouvez simplement renvoyer vos identifiants de ressources de mise en page dans 'getItemViewType'. Et puis, dans 'onCreateViewHolder', gonflez' viewType' dans le paramètre method. –

+0

Vous pouvez, mais cette astuce atteint son plein potentiel uniquement si vous utilisez le même ViewHolder pour les deux mises en page. Sinon, vous restez avec if-elses dans create et bind et le gain est minime. –

0

Si vous le souhaitez, vous pouvez certainement écrire une couche intermédiaire à accepter un adaptateur multiple.

Vous pouvez jeter un oeil à ce que je fais si vous êtes intéressé. https://github.com/Jintin/MixAdapter