2015-07-06 9 views
32

Mam przypadek użycia, w którym potrzebuję odniesienia do rodzica RecyclerView z wnętrza adaptera, szczególnie wewnątrz metody onBindViewHolder. Do tej pory to, co robię jest przypisanie go do prywatnej członka klasy w metodzie onCreateViewHolder przechodząc wzdłuż viewGroup parent arg tak:Czy istnieje lepszy sposób uzyskania odniesienia do rodzica RecyclerView z adaptera?

private ViewGroup mParent; 

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

I przedstawieniu rodzicom RecyclerView w onBindViewHolder tak:

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

Czy jest lepszy sposób na zrobienie tego? Może RecyclerView.Adapter ma sposób, który mogłem przegapić?

Odpowiedz

84

Istnieje konkretna metoda wywołania zwrotnego za pomocą narzędzia RecyclerView dołączanego do adaptera. Wystarczy zastąpić metodę onAttachedToRecylerView().

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.... 
    } 
+1

Jak to przegapiłem w dokumentacji! Dziękuję, właśnie tego szukałem! – nabir

1

Prawdopodobnie chcesz utworzyć interfejs wewnątrz viewHolder i przekazać go rodzicowi i tam go zaimplementować.

1

Innym sposobem jest przekazanie odwołania do konstruktora, np.

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) { 
     ... 
    } 
} 
Powiązane problemy