¿Existe una mejor manera de obtener una referencia al RecyclerView principal desde el adaptador?

81

Tengo un caso de uso en el que necesito una referencia al padre RecyclerViewdesde el interior del adaptador, específicamente dentro del onBindViewHoldermétodo. Hasta ahora, lo que estoy haciendo es asignarlo a un miembro de la clase privada en el onCreateViewHoldermétodo que pasa a lo largo del viewGroup parentargumento así:

private ViewGroup mParent;

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

Y haciendo referencia al padre RecyclerViewde onBindViewHolderesta manera:

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

¿Existe una forma mejor de hacer esto? ¿Quizás RecyclerView.Adaptertiene un camino que quizás me haya perdido?

nabir
fuente

Respuestas:

221

En realidad, hay un método específico que devuelve la llamada con el RecyclerViewque se conecta al adaptador. Simplemente anule el onAttachedToRecylerView(RecyclerView recyclerView)método.

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
fuente
1
¡Cómo me perdí esto en la documentación! ¡Gracias, esto es exactamente lo que estaba buscando!
nabir
5
La documentación dice: "Tenga en cuenta que el mismo adaptador puede ser observado por varios RecyclerViews". developer.android.com/reference/android/support/v7/widget/… Corríjame si me equivoco, pero ¿no creará un problema si asigna el adaptador a más de un RecyclerView?
UnTraDe
3
@UnTraDe sí lo haría. El código anterior sobrescribirá la instancia anterior de RecyclerView. Una solución sería mantener una lista de instancias de RecyclerView adjuntas y eliminar instancias en onDetachedFromRecyclerView (..). Si es posible, sería mejor evitar esto y simplemente crear una instancia del adaptador para cada instancia de RecyclerView.
masterwok
vale 200 como!
iuq
3

Otra forma es pasar una referencia en el constructor, por ejemplo

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
fuente
No recomiendo, generalmente pasa contexto, lista de elementos, las cosas también se ponen de moda al pasar la vista del reciclador
Ahmed Rajab