Czy istnieje lepszy sposób uzyskania odwołania do elementu nadrzędnego RecyclerView z karty?

81

Mam przypadek użycia, w którym potrzebuję odwołania do rodzica RecyclerViewz wnętrza adaptera, a konkretnie z wnętrza onBindViewHoldermetody. Do tej pory przypisuję go do członka klasy prywatnej w onCreateViewHoldermetodzie przekazującej viewGroup parentargument w następujący sposób:

private ViewGroup mParent;

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

I odnosząc się do rodzica RecyclerVieww onBindViewHolderten sposób:

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

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

nabir
źródło

Odpowiedzi:

221

W rzeczywistości istnieje konkretna metoda, która wywołuje zwrot z tym, RecyclerViewktóry jest dołączony do adaptera. Po prostu zastąp onAttachedToRecylerView(RecyclerView recyclerView)metodę.

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
źródło
1
Jak przegapiłem to w dokumentacji! Dziękuję, właśnie tego szukałem!
nabir
5
Dokumentacja mówi: „Należy pamiętać, że ten sam adapter może być obserwowany przez wiele RecyclerViews”. developer.android.com/reference/android/support/v7/widget/ ... Popraw mnie, jeśli się mylę, ale czy nie spowoduje to problemu, jeśli przypiszesz adapter do więcej niż jednego RecyclerView?
UnTraDe
3
@UnTraDe tak, byłoby. Powyższy kod zastąpiłby poprzednie wystąpienie RecyclerView. Rozwiązaniem byłoby utrzymanie listy dołączonych instancji RecyclerView i usunięcie instancji w onDetachedFromRecyclerView (..). Jeśli to możliwe, najlepiej byłoby tego uniknąć i po prostu utworzyć instancję adaptera dla każdej instancji RecyclerView.
masterwok
wart 200. lajka!
iuq
3

Innym sposobem jest przekazanie referencji w konstruktorze, 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) {
        ...
    }
}
Dimitar Genov
źródło
Nie polecam, zwykle przekazujesz kontekst, listę przedmiotów, sprawy robią się dziwne, przechodząc również widok recyklera
Ahmed Rajab