2

我正在使用与 rxjava2 兼容的 rxbindings 快照版本,一切正常,但我不知道如何处理 recyclerView 适配器内的点击事件。我尝试使用“rxjava 1 方式”,但它不起作用。

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 也不会抛出任何异常,我不知道为什么。

4

1 回答 1

1

我不知道你是否已经想通了,但你应该在 ViewHolder 类中处理 clicks 事件。

   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 一起使用,效果很好!

于 2017-06-17T20:58:53.357 回答