2016-11-04 11 views
0

私はあなたの理解を深めていただくためにコードを簡略化しました。 私はMyAdapterMyActivityの両方を完全に使用しています。別のアクティビティをリスナーに実装する方法

class MyAdapter extends RecyclerView... { 
    ... 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
    ... 

    holder.mImageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ((Listener) context).onSelected(object); 
      } 
     }); 
    } 
    ... 
} 

class MyActivity implements MyAdapter.Listener { 
    ... 

    @Override 
    public void onSelected(Object object) { 
     // do things with object here 
    } 
    ... 
} 

私は別のアクティビティを作りたいMyAnotherActivityMyAdapter.Listenerを実装します。 私のアプリケーションを実行し、オブジェクトをクリックすると、オーバーライドされたonSelected()は無視されます。

public class MyAnotherActivity implements MyAdapter.Listener { 
    ... 
    @Override 
    public void onSelected(Object object) { 
     Log.e("MyAnotherActivity", "This text doesn't shows"); 
    } 
    ... 
} 
+0

が '' MyAdapter'のインスタンスを使用MyAnotherActivity'い道に沿ってあなたを助けるでしょうか? 'MyActivity'と同様に、正しく設定されていると思いますか? – drhr

+0

'MyAnotherActivity'は' MyActivity'と完全に別です。私はあなたがコードをあまりにも単純化したと思う。 –

答えて

0

使用Listener実装はMyAdapterコンストラクタに渡されたcontextパラメータに依存します。この行には((Listener) context).onSelected(object);のMyAdapterクラスのcontextフィールドがListenerの実装にキャストされているためです。

したがって、MyAdapterのコンストラクタを呼び出すときは、MyAnotherActivityのコンテキストを渡す必要があります。

public class MyAnotherActivity implements MyAdapter.Listener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     MyAdapter adapter = new MyAdapter(this /*Context of MyAnotherActivity*/, ...); 
     ... 
    } 
} 
0

アクティビティだけでなく、クラス内に任意のメソッドを実装したい場合は、イベントやイベントを渡すための軽量ライブラリのEventBusを使用できます。

それは実現するのは非常に簡単で、コードサンプルは http://greenrobot.org/eventbus/

関連する問題