从 Viewholder 通知 RecyclerView Adapter 的最佳方式?

Best way to notify RecyclerView Adapter from Viewholder?

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

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

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

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

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

在您的 activity 或片段中的某处:

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