Created
October 21, 2016 19:59
-
-
Save nightscape/23cd6fc45223afcc0ee892ca68012791 to your computer and use it in GitHub Desktop.
Simple RxJava-based adapter for an Android RecyclerView
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class ReactiveTextViewHolder<T> extends ReactiveViewHolder<T> { | |
private TextView label; | |
private T currentItem; | |
public ReactiveTextViewHolder(View itemView) { | |
super(itemView); | |
label = (TextView) itemView.findViewById(android.R.id.text1); | |
} | |
@Override | |
public void setCurrentItem(T currentItem) { | |
this.currentItem = currentItem; | |
this.label.setText(currentItem.toString()); | |
} | |
public T getCurrentItem() { | |
return currentItem; | |
} | |
} | |
ReactiveRecylerAdapter.ReactiveViewHolderFactory<String> viewAndHolderFactory = (parent, pViewType) -> { | |
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false); | |
return new ReactiveRecylerAdapter.ReactiveViewHolderFactory.ViewAndHolder<>( | |
view, | |
new ReactiveRecylerAdapter.ReactiveTextViewHolder<>(view) | |
); | |
}; | |
ReactiveRecylerAdapter reactiveRecylerAdapter = new ReactiveRecylerAdapter(Observable.just("Here", "we", "go"), viewAndHolderFactory); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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<T> extends RecyclerView.Adapter<ReactiveRecylerAdapter.ReactiveViewHolder<T>> { | |
private final Observable<List<T>> observable; | |
private final ReactiveViewHolderFactory<T> viewHolderFactory; | |
private List<T> currentList; | |
public ReactiveRecylerAdapter(Observable<List<T>> observable, ReactiveViewHolderFactory<T> 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<T> mViewClickSubject = PublishSubject.create(); | |
public Observable<T> getViewClickedObservable() { | |
return mViewClickSubject; | |
} | |
@Override | |
public ReactiveViewHolder<T> onCreateViewHolder(@NonNull ViewGroup parent, int pViewType) { | |
ReactiveViewHolderFactory.ViewAndHolder<T> viewAndHolder = viewHolderFactory.createViewAndHolder(parent, pViewType); | |
ReactiveViewHolder<T> viewHolder = viewAndHolder.viewHolder; | |
RxView.clicks(viewAndHolder.view) | |
.takeUntil(RxView.detaches(parent)) | |
.map(aVoid -> viewHolder.getCurrentItem()) | |
.subscribe(mViewClickSubject); | |
return viewHolder; | |
} | |
@Override | |
public void onBindViewHolder(ReactiveViewHolder<T> holder, int position) { | |
T item = currentList.get(position); | |
holder.setCurrentItem(item); | |
} | |
@Override | |
public int getItemCount() { | |
return currentList.size(); | |
} | |
public static abstract class ReactiveViewHolder<T> extends RecyclerView.ViewHolder { | |
public ReactiveViewHolder(View itemView) { | |
super(itemView); | |
} | |
public abstract void setCurrentItem(T t); | |
public abstract T getCurrentItem(); | |
} | |
public interface ReactiveViewHolderFactory<T> { | |
class ViewAndHolder<T> { | |
public final View view; | |
public final ReactiveViewHolder<T> viewHolder; | |
public ViewAndHolder(View view, ReactiveViewHolder<T> viewHolder) { | |
this.view = view; | |
this.viewHolder = viewHolder; | |
} | |
} | |
ViewAndHolder<T> createViewAndHolder(@NonNull ViewGroup parent, int pViewType); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment