2017-03-03 2 views
2

rxjava2와 호환되는 rxbindings 스냅 샷 버전을 사용하고 있으며 모든 것이 완벽하게 작동하지만 recyclerView 어댑터 내부에서 클릭 이벤트를 처리하는 방법을 알지 못합니다. "rxjava 1 way"를 사용하려고했지만 작동하지 않습니다.재활용 어댑터에서 Rxjava2보기 클릭

RxJava 1.0 :

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 :

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); 
    } 
} 

및 활동에

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

같은 접근 방식은 rxjava2와 함께 작동하지 둘 다 어떤 예외가 발생하고 있지 않습니다 나는 이유를 알 수 없었다.

답변

1

당신이 이미 알아 낸 것인지 모르겠지만 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

이봐, @ 투비! 네가 옳아! onClickSubject.hide()를 사용해야합니다. 그렇지 않으면 Observable에 PublishSubject를 캐스팅합니다. 이미 관찰 가능합니다. – Regulo

+0

네,하지만 이것은 뷰홀 (viewholder) 내부 클래스를 만들어야한다는 것을 의미합니다. 이것은 외부 클래스 – mayosk

관련 문제