import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.jakewharton.rxbinding.view.RxView; import java.util.Collections; import java.util.List; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.subjects.PublishSubject; public class ReactiveRecylerAdapter extends RecyclerView.Adapter> { private final Observable> observable; private final ReactiveViewHolderFactory viewHolderFactory; private List currentList; public ReactiveRecylerAdapter(Observable> observable, ReactiveViewHolderFactory viewHolderFactory) { this.viewHolderFactory = viewHolderFactory; this.currentList = Collections.emptyList(); this.observable = observable; this.observable.observeOn(AndroidSchedulers.mainThread()).subscribe(items -> { this.currentList = items; this.notifyDataSetChanged(); }); } private PublishSubject mViewClickSubject = PublishSubject.create(); public Observable getViewClickedObservable() { return mViewClickSubject; } @Override public ReactiveViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int pViewType) { ReactiveViewHolderFactory.ViewAndHolder viewAndHolder = viewHolderFactory.createViewAndHolder(parent, pViewType); ReactiveViewHolder viewHolder = viewAndHolder.viewHolder; RxView.clicks(viewAndHolder.view) .takeUntil(RxView.detaches(parent)) .map(aVoid -> viewHolder.getCurrentItem()) .subscribe(mViewClickSubject); return viewHolder; } @Override public void onBindViewHolder(ReactiveViewHolder holder, int position) { T item = currentList.get(position); holder.setCurrentItem(item); } @Override public int getItemCount() { return currentList.size(); } public static abstract class ReactiveViewHolder extends RecyclerView.ViewHolder { public ReactiveViewHolder(View itemView) { super(itemView); } public abstract void setCurrentItem(T t); public abstract T getCurrentItem(); } public interface ReactiveViewHolderFactory { class ViewAndHolder { public final View view; public final ReactiveViewHolder viewHolder; public ViewAndHolder(View view, ReactiveViewHolder viewHolder) { this.view = view; this.viewHolder = viewHolder; } } ViewAndHolder createViewAndHolder(@NonNull ViewGroup parent, int pViewType); } }