从 Viewholder 通知 RecyclerView 适配器的最佳方式?

Posted

技术标签:

【中文标题】从 Viewholder 通知 RecyclerView 适配器的最佳方式?【英文标题】:Best way to notify RecyclerView Adapter from Viewholder? 【发布时间】:2017-09-12 00:31:48 【问题描述】:

我有一个包含多个项目视图类型的 RecyclerView,因此它们被分解为单独的 ViewHolder 类。之前,当所有 ViewHolders 与 RecyclerView Adapter 属于同一类时,我可以在单击或删除项目时直接更新适配器。但是,我将 ViewHolders 分成不同的类以更好地组织代码。现在,我无法直接更新我的 RecyclerView 适配器。以下哪种解决方案是从 ViewHolder 与 Adapter 进行通信的最佳方式?如果有比我列出的更好的解决方案,请提出建议!

    使用带有回调侦听器的接口。请记住,可能有 5 到 10 种不同的视图类型,那么这种方法需要 5 到 10 个接口吗?
      使用 Eventbus 库,例如 Greenrobot 的 Eventbus。

接口或事件总线解决方案真的是最好的方法吗?肯定有更好的方法在视图和适配器之间进行通信!

【问题讨论】:

你也可以使用数据绑定。 【参考方案1】:

我通常在活动或片段中保存对适配器的引用。 ViewHolders 可以作为内部类放置在 Adapter 中,也可以作为类放置在单独的包中。您可以使用一个界面与视图持有者进行交互。您只需要在您的活动或片段中实现它。例如:

public class MyAdapter extends RecyclerView.Adapter<VH> 
    private MyInterface mInterface;

    public MyAdapter(MyInterface i) 
         mInterface = i;
    

    //... some code to create view holders


    //binding
    @Override
    protected void onBindItemViewHolder(ViewHolder viewHolder, final int position, int type) 
        viewHolder.bindView(position, mInterface); //call methods of interface in bindView() methods of your viewHolders
    

    interface MyInterface 
        void someEvent();
    


public class ViewHolder extends RecyclerView.ViewHolder 

    TextView mText;

    ViewHolder(View root) 
        super(root);
        mText = (TextView)root.findViewById(R.id.text)
    

    void bindView(int pos, MyAdapter.MyInterface myInterface) 
        mText.setOnClickListener(v -> myInterface.someEvent());
        //...some other code
    

在你的活动或片段中的某个地方:

final MyAdapter adapter = new MyAdapter(new MyAdapter.MyInterface() 
    @Override
    public void someEvent() 
        adapter.notifyDataSetChanged();
    
);

【讨论】:

感谢您的建议并提供代码位!我稍后会尝试这个,看看我是否可以让它与多个查看器和事件一起工作而不会太麻烦。我会回帖告诉你进展如何! 此方法非常适用于适配器和 Viewholders 之间的交互。对于 Viewholders 和 RecyclerView 之间的交互,EventBus 是更好的选择。 @Ray Li 为什么你需要在 ViewHolder 和 RecyclerView 之间进行通信? RecyclerView 只是一个 ViewGroup,它显示来自它的适配器的数据。除了放置列表的容器之外,我不记得将 RecyclerView 用于其他任何用途。

以上是关于从 Viewholder 通知 RecyclerView 适配器的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

从 Viewholder 通知 RecyclerView 适配器的最佳方式?

不可见的 ViewHolder 动画在 RecyclerView 中延迟

从recyclerview中删除项目(viewholder具有onClick但适配器具有数据集)

从ViewHolder类更新项目数据

如何从 RecyclerView.Adapter<CardAdapter.ViewHolder> 打开片段

尝试从字段 'android.view.View android.support.v7.widget.RecyclerView$ViewHolder.itemView' 中读取