Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import android.os.Handler;
- import android.support.annotation.IntDef;
- import android.support.annotation.NonNull;
- import android.support.annotation.Nullable;
- import android.support.v7.widget.RecyclerView;
- import android.view.View;
- import android.view.ViewGroup;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.util.concurrent.atomic.AtomicBoolean;
- import controllers.constants.CallBackConstants;
- import controllers.listeners.ProcessedResult;
- //Custom adapter with states and endless scroll on bottom rick
- public class StatesRecyclerViewAdapter extends RecyclerViewAdapterWrapper {
- private final View vLoadingView;
- private final View vEmptyView;
- private final View vErrorView;
- @IntDef({STATE_NORMAL, STATE_EMPTY, STATE_ERROR,STATE_ENDLESS})
- @Retention(RetentionPolicy.SOURCE)
- public @interface State {
- }
- public static final int STATE_NORMAL = 0;
- // public static final int STATE_LOADING = 1;
- public static final int STATE_EMPTY = 2;
- public static final int STATE_ERROR = 3;
- public static final int STATE_ENDLESS = 4;
- //public static final int TYPE_LOADING = 1000;
- private static final int TYPE_EMPTY = 1001;
- private static final int TYPE_ERROR = 1002;
- private static final int TYPE_ENDLESS= 1003;
- private AtomicBoolean keepOnAppending;
- private AtomicBoolean dataPending;
- private ProcessedResult requestToLoadMoreListener;
- @State
- private int state = STATE_NORMAL;
- private StatesRecyclerViewAdapter(@NonNull RecyclerView.Adapter wrapped, @Nullable View vLoadingView, @Nullable View emptyView, @Nullable View errorView,
- ProcessedResult requestToLoadMoreListener, boolean keepOnAppending) {
- super(wrapped);
- this.vEmptyView = emptyView;
- this.vErrorView = errorView;
- this.vLoadingView=vLoadingView;
- this.requestToLoadMoreListener = requestToLoadMoreListener;
- this.keepOnAppending = new AtomicBoolean(keepOnAppending);
- dataPending = new AtomicBoolean(false);
- }
- public StatesRecyclerViewAdapter(@NonNull RecyclerView.Adapter wrapped, @Nullable View vLoadingView, @Nullable View emptyView, @Nullable View errorView
- , ProcessedResult requestToLoadMoreListener) {
- this(wrapped,vLoadingView,emptyView,errorView, requestToLoadMoreListener, true);
- }
- private void stopAppending() {
- setKeepOnAppending(false);
- }
- /**
- * Let the adapter know that data is load and ready to view.
- *
- * @param keepOnAppending whether the adapter should request to load more when scrolling to the bottom.
- */
- public void onDataReady(boolean keepOnAppending) {
- dataPending.set(false);
- setKeepOnAppending(keepOnAppending);
- }
- private void setKeepOnAppending(boolean newValue) {
- keepOnAppending.set(newValue);
- if(STATE_ENDLESS==getState())
- setState(STATE_NORMAL);
- else
- notifyWrapperAdapter();
- }
- private void notifyWrapperAdapter()
- {
- new Handler().post(new Runnable() {
- @Override
- public void run(){
- //change adapter contents
- getWrappedAdapter().notifyDataSetChanged();
- }
- });
- }
- /**
- *Restart
- */
- public void restartAppending() {
- dataPending.set(false);
- setKeepOnAppending(true);
- }
- @State
- public int getState() {
- return state;
- }
- public void setState(@State int state) {
- if(state==getState())
- return;
- this.state = state;
- notifyWrapperAdapter();
- new Handler().post(new Runnable() {
- @Override
- public void run(){
- notifyDataSetChanged();
- }
- });
- }
- @Override
- public int getItemCount() {
- switch (state) {
- case STATE_EMPTY:
- case STATE_ERROR: {
- dataPending.set(false);
- return 1;
- }
- case STATE_ENDLESS:
- default:
- return super.getItemCount() + (keepOnAppending.get() ? 1 : 0);
- }
- }
- @Override
- public int getItemViewType(int position) {
- switch (state) {
- case STATE_EMPTY:
- return TYPE_EMPTY;
- case STATE_ERROR:
- return TYPE_ERROR;
- case STATE_ENDLESS:
- return TYPE_ENDLESS;
- default: {
- if (position == getWrappedAdapter().getItemCount())
- return TYPE_ENDLESS;
- return super.getItemViewType(position);
- }
- }
- }
- @Override
- public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- switch (viewType) {
- case TYPE_EMPTY:
- return new SimpleViewHolder(vEmptyView);
- case TYPE_ERROR:
- return new SimpleViewHolder(vErrorView);
- case TYPE_ENDLESS:
- return new SimpleViewHolder(vLoadingView);
- default:
- return super.onCreateViewHolder(parent, viewType);
- }
- }
- @Override
- public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
- switch (state) {
- case STATE_EMPTY:
- case STATE_ERROR:
- onBindCViewHolder(holder, position);
- return;
- case STATE_ENDLESS:
- endlessRecycler();
- return;
- default:
- if (getItemViewType(position) == TYPE_ENDLESS)
- endlessRecycler();
- else
- super.onBindViewHolder(holder, position);
- }
- }
- private void endlessRecycler()
- {
- if (!dataPending.get()) {
- dataPending.set(true);
- requestToLoadMoreListener.processedResult(null, CallBackConstants.LOAD_MORE_METHOD);
- }
- }
- private void onBindCViewHolder(RecyclerView.ViewHolder holder, int position) {
- }
- private static class SimpleViewHolder extends RecyclerView.ViewHolder {
- SimpleViewHolder(View itemView) {
- super(itemView);
- }
- }
- public interface ProcessedResult {
- <IResponse,IMethod>void processedResult(IResponse iResponse, IMethod iMethod);
- }
- }
Add Comment
Please, Sign In to add comment