84

I have a use case where I need a reference to the parent RecyclerView from inside the adapter, specifically inside the onBindViewHolder method. So far what I am doing is assigning it to a private class member in the onCreateViewHolder method passing along the viewGroup parent arg like so:

private ViewGroup mParent;

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

And referencing the parent RecyclerView in onBindViewHolder like this:

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

Is there a better way of doing this? Maybe RecyclerView.Adapter has a way that I may have missed?

nabir
  • 1,287
  • 2
  • 10
  • 17

2 Answers2

229

There's actually a specific method that callsback with the RecyclerView that attaches to the adapter. Just override the onAttachedToRecylerView(RecyclerView recyclerView) method.

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....
    }
Bugs Happen
  • 1,835
  • 4
  • 25
  • 50
NameSpace
  • 9,306
  • 3
  • 34
  • 39
  • 2
    How did I miss this in the documentation! Thank you, this is exactly what I was looking for! – nabir Jul 06 '15 at 19:05
  • 5
    The documentation says: "Keep in mind that same adapter may be observed by multiple RecyclerViews." https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#onAttachedToRecyclerView(android.support.v7.widget.RecyclerView) Correct me if I'm wrong but won't it create problem if you assign the adapter to more than one RecyclerView? – UnTraDe Mar 13 '18 at 10:31
  • 3
    @UnTraDe yes it would. The code above would overwrite the previous RecyclerView instance. A solution would be to maintain a list of attached RecyclerView instances and remove instances in onDetachedFromRecyclerView(..). If possible, it would be best to avoid this and just create an instance of the adapter for each RecyclerView instance. – masterwok Aug 02 '18 at 20:42
  • worth 200th like! – iuq May 25 '20 at 18:56
3

Another way is passing a reference in the constructor, e.g.

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
  • 1,982
  • 10
  • 11