首页 文章

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

提问于
浏览
3

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

  • 使用具有回调侦听器的接口 . 请记住,可能有5-10种不同的视图类型,因此这种方法需要5-10个接口?

  • 使用Eventbus库,如Greenrobot的Eventbus .

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

1 回答

  • 7

    我通常在活动或片段中保存对适配器的引用 . 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();
        }
    });
    

相关问题