2017-03-03 3 views
2

Ich verwende Rxbindings Snapshot-Version kompatibel mit RXJAVA2 und alles funktioniert perfekt, aber ich weiß nicht, wie mit Klickereignissen in RecyclerView-Adapter umzugehen. Ich habe versucht, "rxjava 1 Way" zu verwenden, aber es funktioniert nicht.Rxjava2 Ansicht Klicks im Recycler-Adapter

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

und in Tätigkeit:

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

Der gleiche Ansatz funktioniert nicht mit rxjava2 weder wirft jede Ausnahme, und Ich konnte nicht herausfinden warum.

Antwort

1

Ich weiß nicht, ob Sie das bereits herausgefunden haben, aber Sie sollten Clicks-Ereignis innerhalb der ViewHolder-Klasse behandeln.

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

}

habe ich etwas ähnliches und ich rxbinding2 mit rxjava2 und es funktionierte perfekt!

+0

Warten Sie, werfen Sie PublishSubject auf beobachtbar? Sollte das nicht mit 'onClickSubject.hide()' geschehen? – Tuby

+1

Hey, @Tuby! Du hast recht! Ich sollte onClickSubject.hide() verwenden, andernfalls werfe ich PublishSubject auf beobachtbar, was bereits beobachtbar ist. – Regulo

+0

Ja, aber das bedeutet, dass Sie die innere Klasse des Viewholders erstellen müssen, was eine schlechte Idee ist, weil Sie den Verweis auf die äußere Klasse beibehalten – mayosk