有没有更好的方法从适配器获取对父 RecyclerView 的引用?

Posted

技术标签:

【中文标题】有没有更好的方法从适配器获取对父 RecyclerView 的引用?【英文标题】:Is there a better way of getting a reference to the parent RecyclerView from the adapter? 【发布时间】:2015-09-23 18:11:46 【问题描述】:

我有一个用例,我需要从适配器内部引用父 RecyclerView,特别是在 onBindViewHolder 方法内部。到目前为止,我正在做的是将其分配给 onCreateViewHolder 方法中的私有类成员,该方法沿 viewGroup parent arg 传递,如下所示:

private ViewGroup mParent;

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

并像这样在onBindViewHolder 中引用父级RecyclerView

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

有没有更好的方法来做到这一点?也许RecyclerView.Adapter 有我可能错过的方式?

【问题讨论】:

【参考方案1】:

实际上有一个特定的方法可以使用附加到适配器的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....
    

【讨论】:

我怎么在文档中错过了这个!谢谢,这正是我想要的! 文档说:“请记住,多个 RecyclerViews 可能会观察到同一个适配器。” developer.android.com/reference/android/support/v7/widget/…如果我错了,请纠正我,但如果您将适配器分配给多个 RecyclerView 会不会产生问题? @UnTraDe 是的。上面的代码会覆盖之前的 RecyclerView 实例。一种解决方案是维护附加的 RecyclerView 实例列表并删除 onDetachedFromRecyclerView(..) 中的实例。如果可能,最好避免这种情况,只为每个 RecyclerView 实例创建一个适配器实例。 值得第 200 个赞!【参考方案2】:

另一种方法是在构造函数中传递引用,例如

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

【讨论】:

我不推荐,您通常会传递上下文、项目列表,通过回收站视图也会变得热闹

以上是关于有没有更好的方法从适配器获取对父 RecyclerView 的引用?的主要内容,如果未能解决你的问题,请参考以下文章

从 Cloud Firestore 检索时,Recycler View 未加载数据

onClickListener 在 Recycler Adapter 类中不起作用

Android recycler view onItemClick 识别适配器

Netty对象重用:Recycler源码分析

Recycler多布局(适配器)之有Type值

Recycler多布局(适配器)之无Type值