2017-04-16 14 views
2

複数のアイテムビュータイプを持つRecyclerViewを持っているので、別々のViewHolderクラスに分割されています。以前は、すべてのViewHoldersがRecyclerViewアダプタと同じクラスに入っていたので、アイテムがクリックまたは削除されたときにアダプタを直接更新することができました。しかし、私はViewHoldersを別のクラスに分けて、コードを整理しました。今、自分のRecyclerViewアダプタを直接更新することはできません。 ViewHolderからアダプタに通信する最も良い方法は次のうちどれですか?リストにあるものよりも優れた解決策がある場合は、お勧めします!RecyclerViewアダプタをViewholderから通知する最も良い方法は?

  1. コールバックリスナーでのインターフェイスの使用。 5〜10種類のビュータイプがある可能性があるので、この方法では5〜10のインターフェイスが必要です。
    1. GreenrobotのEventbusなどのEventbusライブラリを使用してください。

本当に最善の方法インタフェースまたはeventbusソリューションですか?確かにビューとアダプタ間の通信のためのより良い方法でなければなりません!

+0

また、データバインディングを使用することができます。 – BlackHatSamurai

答えて

4

私は通常、アクティビティやフラグメントのアダプタへの参照を保存します。 ViewHoldersは、アダプタの内部クラスとして、または別のパッケージのクラスとして配置できます。 1つのインターフェースを使用してビュー・ホルダーと対話することができます。アクティビティやフラグメントに実装するだけで済みます。たとえば、次のように

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

このメソッドは、アダプタとビュー所有者間のやりとりに役立ちます。 ViewholderとRecyclerViewの間のやりとりのために、EventBusがより良い選択肢です。 –

関連する問題