2016-05-04 10 views
0

時にはRecyclerViewアダプタで使用すると、各行の項目をクリックしたときには、関数を呼び出すと便利ですので、私はインターフェイスを定義し、そのようにリスナーを割り当てる:アダプタでインタフェースリスナを割り当てる正しい場所はどこですか?

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.RecyclerViewHolder> { 
    private List<SomeObject> mSomeObjectList; 
    private Context mContext; 
    private RowClickListener mListener; 

    public interface RowClickListener { 
     void someFunction(SomeObject someObject); 
    } 

    public MyRecyclerViewAdapter(Context context, List<SomeObject> objects) { 
     mContext = context; 
     mSomeObjectList = objects; 
     mListener = (RowClickListener) context; 
    } 
    //... 

が、これはそれを行うための正しい方法ですか?私は、人々がFragmentクラスでリスナーを割り当てるとき、通常はOnAttachメソッドでそれを行い、アダプタの場合は実際には存在しないように見えます。ここでは、適切な場所とは何でしょうか?

+0

リスナーオブジェクトはいつ作成しますか? –

答えて

1

Adapterに定義するのではなく、FragmentまたはActivityで使用することをお勧めします。

Interfaceの個別クラスを定義するか、Fragment/Activityに定義します。

public class SomeActivity extends Activity implements RowClickListener 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     . 
     . 
     . 
     MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(context,list,this); 
    } 

    @Override 
    public void someFunction(SomeObject someObject){ 

    } 
} 

public interface RowClickListener { 
    void someFunction(SomeObject someObject); 
} 

とあなたのアダプタクラスで

private RowClickListener mListener; 

public MyRecyclerViewAdapter(Context context, List<SomeObject> objects, RowClickListener listener) { 
    mContext = context; 
    mSomeObjectList = objects; 
    mListener = listener; 
} 
+0

私はこのアプローチが好きですが、なぜわからないのですか?このようにした理由は何ですか? –

+0

私は一般的にインターフェイスのための別のクラスを定義するために私はそれを複数回使用することができます、他の理由はありません。 –

+0

私は通常、クラス内にインターフェイスを配置しています。どのようにそれらを別のクラスにしますか? –

0

はい、アダプタのコンストラクタによってリスナーを渡すことは結構です。ただし、キャスティングする前にタイプを確認してください。

public MyRecyclerViewAdapter(Context context, List<SomeObject> objects) 
{ 
     mContext = context; 
     mSomeObjectList = objects; 

     if(context instanceOf RowClickListener) 
     { 
      mListener = (RowClickListener) context; 
     } 
    } 
+0

どのようにインターフェイスを通常どおり定義しますか?ほとんどの人は別のファイルを使用するか、別のクラスの中に入れ子にしますか? –

+0

インターフェイスが単一クラスでのみ使用されている場合は、そのクラスを定義しても構いません。多くのクラスでインターフェイスを実装する場合は、別のファイルにインターフェイスを定義することを検討してください。 – Bob

関連する問題