Есть ли лучший способ получить ссылку на родительский RecyclerView из адаптера?

81

У меня есть случай использования, когда мне нужна ссылка на родителя RecyclerViewизнутри адаптера, в частности внутри onBindViewHolderметода. Пока что я назначаю его частному члену класса в onCreateViewHolderметоде, передающем viewGroup parentarg следующим образом:

private ViewGroup mParent;

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

И ссылки на родителя RecyclerViewв onBindViewHolderследующим образом:

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

Есть ли лучший способ сделать это? Может, RecyclerView.Adapterесть способ, который я пропустил?

набир
источник

Ответы:

221

На самом деле существует особый метод, который выполняет обратный вызов с помощью RecyclerView, прикрепляемой к адаптеру. Просто переопределите onAttachedToRecylerView(RecyclerView recyclerView)метод.

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
источник
1
Как я это пропустил в документации! Спасибо, это именно то, что я искал!
nabir 06
5
В документации говорится: «Имейте в виду, что один и тот же адаптер может наблюдаться несколькими RecyclerViews». developer.android.com/reference/android/support/v7/widget/… Поправьте меня, если я ошибаюсь, но не возникнет ли проблема, если вы назначите адаптер более чем одному RecyclerView?
UnTraDe
3
@UnTraDe да, будет. Приведенный выше код перезапишет предыдущий экземпляр RecyclerView. Решением было бы вести список прикрепленных экземпляров RecyclerView и удалять экземпляры в onDetachedFromRecyclerView (..). Если возможно, лучше всего этого избежать и просто создать экземпляр адаптера для каждого экземпляра RecyclerView.
masterwok
стоит 200-е вроде!
iuq
3

Другой способ - передать ссылку в конструктор, например

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) {
        ...
    }
}
Димитар Генов
источник
Я не рекомендую, вы обычно передаете контекст, список элементов, все становится оживленным, когда вы также просматриваете переработку,
Ахмед Раджаб