2017-04-16 137 views
2

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

  1. 对回调监听器使用接口。请记住,可能有5 - 10种不同的视图类型,所以这种方法需要5 - 10个接口?
    1. 使用事件总线库,例如Greenrobot的Eventbus。

是一个接口或eventbus解决方案真的是最好的方法是什么?在视图和适配器之间进行通信肯定有更好的方法!

+0

你也可以使用数据绑定。 – BlackHatSamurai

回答

4

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

感谢您的建议和提供代码位一起去!我将在稍后尝试此操作,看看我是否可以在不会太麻烦的情况下使用多个查看者和事件。我会回复并让你知道它是怎么回事! –

+0

此方法适用于适配器和视图之间的交互。对于Viewholders和RecyclerView之间的交互,EventBus是一个更好的选择。 –

相关问题