从视图持有人通知Recyclerview适配器的最佳方法



我有一个带有多个项目视图类型的recyclerview,因此将它们分解为单独的视图持有人类。之前,当所有视图持有人与回收库适配器都在同一类时,我可以在单击或删除项目时直接更新适配器。但是,我将视图持有人分为不同的类,以更好地组织代码。现在,我无法直接更新我的RecyClerview适配器。以下哪种解决方案是从我的视图持有人到适配器进行交流的最佳方法?如果有比我列出的解决方案更好的解决方案,请建议!

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

接口或EventBus解决方案真的是最好的方法吗?肯定必须有一种更好的方法来进行视图和适配器之间的交流!

i通常在活动或片段中保存对适配器的引用。可以将视图持有人放在适配器中的内部类别,也可以在单独的软件包中作为类。您可以使用一个接口与视图持有人进行交互。您只需要在活动或碎片中实现它即可。例如:

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();
    }
});

相关内容

最新更新