2017-03-03 5 views
2

rxjava2と互換性のあるrxbindingsスナップショットバージョンを使用していますが、すべて正常に動作しますが、recyclerViewアダプター内のクリックイベントの処理方法はわかりません。私は "rxjava 1 way"を使用しようとしましたが、動作しません。リサイクラーアダプターのRxjava2ビューのクリック

RxJava 1.0:

class RecyclerAdapter ... { 
    private final PublishSubject<Int> onClickSubject = PublishSubject.create(); 

    Observable<Int> getItemClickSignal() { 
     return onClickSubject; 
    } 

    @Override 
    public void onBindViewHolder(EcommerceAdapter.ViewHolder holder, int position) { 
     RxView.clicks(holder.itemView) 
        .map(aVoid -> position) 
        .subscribe(mOnClickSubject); 
    } 
} 

と活動中:

class Activity ... { 

    mAdapter.getItemClickSignal() 
      .subscribe(new Subscriber<Int>() { 
       @Override 
       public void onCompleted() {} 

       @Override 
       public void onError(Throwable e) { 
        e.printStackTrace(); 
       } 

       @Override 
       public void onNext(int position) { 
        Log.d(TAG, position); 
       } 
      }); 
} 

Rxjava 2.0:

mAdapter.getItemClickSignal() 
      .subscribe(new Consumer<Integer>() { 
       @Override 
       public void accept(@NonNull Integer integer) throws Exception { 
        Log.d(TAG, position);       
       } 
      }); 

同じアプローチがrxjava2では動作しませんどちらも任意の例外をスローしない、と私は理由を理解できませんでした。

答えて

1

あなたがこれをすでに理解しているかどうかわかりませんが、ClickイベントをViewHolderクラス内で処理する必要があります。

class RecyclerAdapter extends RecyclerView.Adapter<ViewHolder> { 

    private final PublishSubject<Int> onClickSubject = PublishSubject.create(); 

    Observable<Int> getItemClickSignal() { 
     return onClickSubject; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder{ 
    // All your fields 

    public ViewHolder(View itemView) { 
     super(itemView); 
      RxView.clicks(itemView) 
       .map(__ -> getAdapterPosition()) 
       .subscribe(mOnClickSubject); 
    } 
    } 

    @Override 
    public void onBindViewHolder(EcommerceAdapter.ViewHolder holder, int 
     position) { 

    } 
    } 


class Activity ... { 

    mAdapter.getItemClickSignal() 
     .subscribe(new Subscriber<Int>() { 
      @Override 
      public void onCompleted() {} 

      @Override 
      public void onError(Throwable e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onNext(int position) { 
       Log.d(TAG, position); 
      } 
     }); 

}

私は似た何かをしたと私はrxjava2とrxbinding2を使用し、それは完全に働きました!

+0

お待ちください、PublishSubjectを観測可能にキャストしていますか?それは 'onClickSubject.hide()'で行うべきではありませんか? – Tuby

+1

ねえ、@Tuby!あなたが正しい!私はonClickSubject.hide()を使用する必要があります。そうでなければ、私はPublishSubjectをobservableにキャストしています。これはobservableです。 – Regulo

+0

はい、これはビューホールダーの内部クラスを作成する必要があることを意味します。これは、外部クラス – mayosk

関連する問題