web-dev-qa-db-fra.com

Comment définir deux adaptateurs sur un RecyclerView?

Je développe une application Android dans laquelle je stocke deux types d'informations différentes sur «FirebaseDatabase».

Ensuite, dans la MainActivity, je les récupère et les montre aux utilisateurs dans une RecyclerView. Les deux informations sont censées être affichées dans différentes mises en page, c'est-à-dire qu'elles sont différentes et c'est pourquoi j'ai deux classes Model Model différentes et maintenant deux adaptateurs différents. J'utilise FastAdapter by @MikePenz

J'ai donc configuré l'adaptateur sur recyclerview dans l'ordre où l'information est extraite 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 n’est qu’un exemple et que je configure 2 adaptateurs différents un par un, Recyclerview est mis à jour avec le 2ème adaptateur et affiche uniquement son contenu.

Alors, comment puis-je afficher ou configurer l’adaptateur sur le même «RecyclerView» et pouvoir afficher le contenu stocké dans les deux adaptateurs?.

10
Hammad Nasir

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

Supposons que vous deviez afficher des objets de deux typesAnimals etBeverages. Gérons le scénario le plus difficile, c’est-à-dire que vos objets nécessitent une présentation complètement différente pour les afficher et une variable ViewHolders complètement différente. Voici la 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
        ...
    }
}

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

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

Par souci de simplicité, supposons que vous stockiez vos objets dans une liste:

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

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

Vous devez d’abord implémenter 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 dans 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 liez le bon détenteur 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);
    } 
} 
20
Marcin Jedynak

Si vous le souhaitez, vous pouvez certainement écrire une couche intermédiaire pour accepter plusieurs adaptateurs.

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

0
Jintin