Чи є кращий спосіб отримати посилання на батьківський RecyclerView з адаптера?


81

У мене є варіант використання, коли мені потрібне посилання на батьківського RecyclerViewзсередини адаптера, зокрема всередині onBindViewHolderметоду. Поки що я роблю, присвоюю це приватному члену класу в onCreateViewHolderметоді, що проходить уздовж 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, є спосіб, який я, можливо, пропустив?

Відповіді:


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

1
Як я це пропустив у документації! Дякую, це саме те, що я шукав!
набір

5
У документації сказано: "Майте на увазі, що один і той же адаптер може спостерігатися кількома RecyclerView." 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) {
        ...
    }
}

Я не рекомендую, ти зазвичай передаєш контекст, список предметів, речі теж дзижчать, передаючи вид переробника
Ахмед Раджаб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.