web-dev-qa-db-de.com

Wie setze ich zwei Adapter auf einen RecyclerView?

Ich entwickle gerade eine Android-App, in der ich zwei verschiedene Arten von Informationen in 'FirebaseDatabase' speichere.

Dann rufe ich sie in MainActivity ab und zeige sie Benutzern in einer RecyclerView. Beide Informationen sollen in unterschiedlichen Layouts dargestellt werden, d. H. Die Layouts für beide sind unterschiedlich. Deshalb habe ich zwei verschiedene Modellklassen und jetzt zwei verschiedene Adapter. Ich verwende FastAdapter von @MikePenz

Was ich also getan habe, ist, dass ich den Adapter in derselben Reihenfolge auf recyclerview gesetzt habe, wie die Informationen aus der Datenbank abgerufen werden:

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

da der Recyclerview nur einer ist und ich zwei verschiedene Adapter nacheinander setze, wird der Recyclerview mit dem 2. Adapter aktualisiert und zeigt nur dessen Inhalt.

Wie kann ich also sowohl den Adapter als auch 'RecyclerView' anzeigen oder einstellen und den in beiden Adaptern gespeicherten Inhalt anzeigen.

10
Hammad Nasir

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

Angenommen, Sie müssen Objekte zweier Typen anzeigen lassen: A Nimals und B Everages. Lassen Sie uns mit dem schwierigsten Szenario umgehen, das heißt, Ihre Objekte benötigen ein völlig anderes Layout, um sie anzuzeigen, und ein völlig anderes 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 fügen Sie Ihrem Adapter Konstanten hinzu, die Ihre Ansichtstypen darstellen:

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

Der Einfachheit halber nehmen wir an, Sie speichern Ihre Objekte in einer Liste:

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

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

Zuerst müssen Sie getItemViewType implementieren:

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

Als Nächstes verwenden Sie den Artikeltyp in 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);
    } 
} 

Zum Schluss binden Sie den richtigen View-Inhaber:

@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

Wenn Sie möchten, können Sie definitiv eine mittlere Schicht schreiben, um mehrere Adapter zu akzeptieren.

Sie können sehen, was ich mache, wenn Sie sich interessieren . https://github.com/Jintin/MixAdapter

0
Jintin