Подтвердить что ты не робот

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

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

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 имеет способ, которым я, возможно, пропустил?

4b9b3361

Ответ 1

На самом деле существует специальный метод, который обращается к RecyclerView, который подключается к адаптеру. Просто переопределите метод 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....
    }

Ответ 2

Возможно, вы хотите создать интерфейс внутри viewHolder и перейти к родительскому и реализовать его там.

Ответ 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) {
        ...
    }
}