【问题标题】:Is there a better way of getting a reference to the parent RecyclerView from the adapter?有没有更好的方法从适配器获取对父 RecyclerView 的引用?
【发布时间】: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 有我可能错过的方式?

【问题讨论】:

    标签: android android-adapter android-recyclerview


    【解决方案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) {
            ...
        }
    }
    

    【讨论】:

    • 我不推荐,您通常会传递上下文、项目列表,通过回收站视图也会变得热闹
    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多