2017-03-03 115 views
2

我使用rxbindings快照版本與rxjava2兼容,一切正常,但我不知道如何處理recyclerView適配器內的點擊事件。我試圖使用「rxjava 1種方法」,但它不起作用。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

我不知道你是否已經知道了這一點,但你應該處理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); 
      } 
     }); 

}

我沒有類似的東西,我用rxbinding2與rxjava2它完美地工作!

+0

等等,你是否將這個PublishSubject轉換爲可觀察的?不應該用'onClickSubject.hide()'完成嗎? – Tuby

+1

嘿,@Tuby!你是對的!我應該使用onClickSubject.hide(),否則,我將PublishSubject強制轉換爲observable,這已經是可觀察的了。 – Regulo

+0

是的,但這意味着你需要做視圖的內部類,這是不好的主意,因爲你繼續引用外部類 – mayosk