Gibt es eine bessere Möglichkeit, vom Adapter einen Verweis auf das übergeordnete RecyclerView abzurufen?

80

Ich habe einen Anwendungsfall, in dem ich einen Verweis auf das übergeordnete RecyclerViewElement innerhalb des Adapters benötige , insbesondere innerhalb der onBindViewHolderMethode. Bisher weise ich es einem privaten Klassenmitglied in der onCreateViewHolderMethode zu, die das viewGroup parentArgument wie folgt weitergibt :

private ViewGroup mParent;

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // inflater logic.
    mParent = parent;
}

Und Referenzierung der Eltern RecyclerViewin onBindViewHolderwie folgt aus :

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // binder logic.
    ((RecyclerView)mParent).blahBlahBlah();
}

Gibt es einen besseren Weg, dies zu tun? Vielleicht RecyclerView.Adapterhabe ich einen Weg verpasst?

Nabir
quelle

Antworten:

220

Es gibt tatsächlich eine bestimmte Methode, die mit der RecyclerViewan den Adapter angeschlossenen Methode zurückruft . Überschreiben Sie einfach die onAttachedToRecylerView(RecyclerView recyclerView)Methode.

public class Adapter_RV extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    RecyclerView mRecyclerView; 


    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        mRecyclerView = recyclerView;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        mRecyclerView....
    }
NameSpace
quelle
1
Wie habe ich das in der Dokumentation vermisst! Danke, genau das habe ich gesucht!
Nabir
5
In der Dokumentation heißt es: "Beachten Sie, dass derselbe Adapter von mehreren RecyclerViews beobachtet werden kann." developer.android.com/reference/android/support/v7/widget/… Korrigieren Sie mich, wenn ich falsch liege, aber wird es kein Problem verursachen, wenn Sie den Adapter mehr als einer RecyclerView zuweisen?
UnTraDe
3
@UnTraDe ja das würde es. Der obige Code würde die vorherige RecyclerView-Instanz überschreiben. Eine Lösung wäre, eine Liste der angehängten RecyclerView-Instanzen zu führen und Instanzen in onDetachedFromRecyclerView (..) zu entfernen. Wenn möglich, vermeiden Sie dies am besten und erstellen Sie einfach eine Instanz des Adapters für jede RecyclerView-Instanz.
Masterwok
Wert 200 wie!
25.
3

Eine andere Möglichkeit besteht darin, eine Referenz im Konstruktor zu übergeben, z

public final class MyAdapter extends RecyclerView.Adapper {
    private final recyclerView;

    public MyAdapter(@NonNull RecyclerView recyclerView) {
        this.recyclerView = recyclerView;
    }

    ...

    @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
        ...
    }
}
Dimitar Genov
quelle
Ich empfehle nicht, Sie übergeben normalerweise den Kontext, die Liste der Elemente, die Dinge werden auch lebhaft, wenn Sie die Recycling-Ansicht passieren
Ahmed Rajab