Skip to content

Instantly share code, notes, and snippets.

@yongjhih
Created March 23, 2015 10:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save yongjhih/b84c24b38b884f97f413 to your computer and use it in GitHub Desktop.
Save yongjhih/b84c24b38b884f97f413 to your computer and use it in GitHub Desktop.
package com.infstory.ui.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import com.infstory.R;
import com.parse.*;
import rx.android.schedulers.*;
import rx.android.app.*;
import rx.android.view.*;
import rx.functions.*;
import rx.Observable;
import rx.schedulers.*;
import rx.subjects.*;
import java.util.concurrent.TimeUnit;
public class RecyclerParseAdapter<T extends ParseObject, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
private ParseQueryAdapter<T> mParseAdapter;
private Subject<T, T> mParseObjectSubject = new SerializedSubject<>(PublishSubject.create());
private Subject<VH, VH> mViewHolderSubject = new SerializedSubject<>(PublishSubject.create());
private Subject<Integer, Integer> mPositionSubject = new SerializedSubject<>(PublishSubject.create());
private ViewGroup mParentViewGroup;
protected Context context;
public RecyclerParseAdapter(Context context, ParseQueryAdapter.QueryFactory<T> factory) {
this.context = context;
mParseAdapter = new ParseQueryAdapter<T>(context, factory) {
@Override
public View getItemView(T parseObject, View view, ViewGroup parent) {
com.story.util.Log8.d(view);
com.story.util.Log8.d(parseObject);
mParseObjectSubject.onNext(parseObject);
super.getItemView(parseObject, view, parent);
return view;
}
@Override
public View getNextPageView(View view, ViewGroup parent) {
loadNextPage();
return view;
}
};
// enable pagination until inflate layout for findTextViewById(android.R.id.text1) in getNextPage()
//mParseAdapter.setPaginationEnabled(false);
mParseAdapter.addOnQueryLoadListener(new SimpleOnQueryLoadListener<T>((objects, e) -> {
//if (e == null) for (T object : objects) com.story.util.Log8.d(object);
com.story.util.Log8.d();
RecyclerParseAdapter.this.notifyDataSetChanged();
if (onDataSetChanged != null) onDataSetChanged.call(RecyclerParseAdapter.this);
}));
mParseAdapter.loadObjects();
Observable.zip(
mParseObjectSubject.asObservable(), // <- parseAdapterQuery.getItemView() <- parseAdapterQuery.getView()
mViewHolderSubject.asObservable(), // <- onBindViewHolder(ViewHolder, ...)
mPositionSubject.asObservable(), (o, viewHolder, position) -> { // <- onBindViewHolder(..., position)
onBindViewHolder(viewHolder, position, o);
return o;
}
)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe();
}
Action1<RecyclerParseAdapter> onDataSetChanged;
public RecyclerParseAdapter onDataSetChanged(Action1<RecyclerParseAdapter> onDataSetChanged) {
this.onDataSetChanged = onDataSetChanged;
return this;
}
public static class SimpleOnQueryLoadListener<R extends ParseObject> implements ParseQueryAdapter.OnQueryLoadListener<R> {
Action0 onLoading;
Action2<List<R>, Exception> onLoaded;
@Override
public void onLoading() {
if (onLoading != null) onLoading.call();
}
@Override
public void onLoaded(List<R> objects, Exception e) {
if (onLoaded != null) onLoaded.call(objects, e);
}
public SimpleOnQueryLoadListener(Action0 onLoading, Action2<List<R>, Exception> onLoaded) {
this.onLoading = onLoading;
this.onLoaded = onLoaded;
}
public SimpleOnQueryLoadListener(Action0 onLoading) {
this.onLoading = onLoading;
}
public SimpleOnQueryLoadListener(Action2<List<R>, Exception> onLoaded) {
this.onLoaded = onLoaded;
}
public SimpleOnQueryLoadListener onLoading(Action0 onLoading) {
this.onLoading = onLoading;
return this;
}
public SimpleOnQueryLoadListener onLoaded(Action2<List<R>, Exception> onLoaded) {
this.onLoaded = onLoaded;
return this;
}
}
/**
* super me
*/
@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
mParentViewGroup = parent;
return null;
}
@Override
public void onBindViewHolder(VH viewHolder, int position) {
mParseAdapter.getView(position, viewHolder.itemView, mParentViewGroup);
mViewHolderSubject.onNext(viewHolder);
mPositionSubject.onNext(new Integer(position));
if (position >= getItemCount() - 1) mParseAdapter.loadNextPage();
}
/** Super me if Override */
public void onBindViewHolder(VH viewHolder, int position, T parseObject) {
com.story.util.Log8.d(parseObject);
if (mOnBindViewHolder != null) mOnBindViewHolder.call(viewHolder, new Integer(position), parseObject);
}
public Action3<VH, Integer, T> mOnBindViewHolder;
public RecyclerParseAdapter onBindViewHolder(Action3<VH, Integer, T> onBindViewHolder) {
mOnBindViewHolder = onBindViewHolder;
return this;
}
@Override
public int getItemCount() {
int i = mParseAdapter.getCount();
com.story.util.Log8.d(i);
return i - 6;
}
}
@yongjhih
Copy link
Author

Usage:

        adapter = new RecyclerParseAdapter<Post, MyViewHolder>(this, () -> {
            ParseQuery<Post> query = Post.getQuery();
            query.include(Post.USER);
            return query;
        }) {
             @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {                                                                                  
                 super.onCreateViewHolder(parent, viewType);
                 final View view = LayoutInflater.from(context).inflate(R.layout.item_view, parent, false);
                 ...
                 return viewHolder;
             }
        };

        feedAdapter.onBindViewHolder((viewHolder, position, post) -> {
        });

@yongjhih
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment