Guest User

custom base adapter

a guest
Dec 31st, 2016
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.44 KB | None | 0 0
  1. import android.os.Handler;
  2. import android.support.annotation.IntDef;
  3. import android.support.annotation.NonNull;
  4. import android.support.annotation.Nullable;
  5. import android.support.v7.widget.RecyclerView;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8.  
  9. import java.lang.annotation.Retention;
  10. import java.lang.annotation.RetentionPolicy;
  11. import java.util.concurrent.atomic.AtomicBoolean;
  12.  
  13. import controllers.constants.CallBackConstants;
  14. import controllers.listeners.ProcessedResult;
  15.  
  16. //Custom adapter with states and endless scroll on bottom rick
  17. public class StatesRecyclerViewAdapter extends RecyclerViewAdapterWrapper {
  18. private final View vLoadingView;
  19. private final View vEmptyView;
  20. private final View vErrorView;
  21.  
  22. @IntDef({STATE_NORMAL, STATE_EMPTY, STATE_ERROR,STATE_ENDLESS})
  23. @Retention(RetentionPolicy.SOURCE)
  24. public @interface State {
  25. }
  26.  
  27. public static final int STATE_NORMAL = 0;
  28. // public static final int STATE_LOADING = 1;
  29. public static final int STATE_EMPTY = 2;
  30. public static final int STATE_ERROR = 3;
  31. public static final int STATE_ENDLESS = 4;
  32.  
  33. //public static final int TYPE_LOADING = 1000;
  34. private static final int TYPE_EMPTY = 1001;
  35. private static final int TYPE_ERROR = 1002;
  36. private static final int TYPE_ENDLESS= 1003;
  37.  
  38. private AtomicBoolean keepOnAppending;
  39. private AtomicBoolean dataPending;
  40. private ProcessedResult requestToLoadMoreListener;
  41.  
  42. @State
  43. private int state = STATE_NORMAL;
  44.  
  45. private StatesRecyclerViewAdapter(@NonNull RecyclerView.Adapter wrapped, @Nullable View vLoadingView, @Nullable View emptyView, @Nullable View errorView,
  46. ProcessedResult requestToLoadMoreListener, boolean keepOnAppending) {
  47. super(wrapped);
  48.  
  49. this.vEmptyView = emptyView;
  50. this.vErrorView = errorView;
  51. this.vLoadingView=vLoadingView;
  52. this.requestToLoadMoreListener = requestToLoadMoreListener;
  53.  
  54. this.keepOnAppending = new AtomicBoolean(keepOnAppending);
  55. dataPending = new AtomicBoolean(false);
  56. }
  57.  
  58. public StatesRecyclerViewAdapter(@NonNull RecyclerView.Adapter wrapped, @Nullable View vLoadingView, @Nullable View emptyView, @Nullable View errorView
  59. , ProcessedResult requestToLoadMoreListener) {
  60. this(wrapped,vLoadingView,emptyView,errorView, requestToLoadMoreListener, true);
  61. }
  62.  
  63. private void stopAppending() {
  64. setKeepOnAppending(false);
  65. }
  66.  
  67. /**
  68. * Let the adapter know that data is load and ready to view.
  69. *
  70. * @param keepOnAppending whether the adapter should request to load more when scrolling to the bottom.
  71. */
  72. public void onDataReady(boolean keepOnAppending) {
  73. dataPending.set(false);
  74. setKeepOnAppending(keepOnAppending);
  75. }
  76.  
  77. private void setKeepOnAppending(boolean newValue) {
  78. keepOnAppending.set(newValue);
  79. if(STATE_ENDLESS==getState())
  80. setState(STATE_NORMAL);
  81. else
  82. notifyWrapperAdapter();
  83. }
  84.  
  85. private void notifyWrapperAdapter()
  86. {
  87. new Handler().post(new Runnable() {
  88. @Override
  89. public void run(){
  90. //change adapter contents
  91. getWrappedAdapter().notifyDataSetChanged();
  92. }
  93. });
  94. }
  95.  
  96. /**
  97. *Restart
  98. */
  99. public void restartAppending() {
  100. dataPending.set(false);
  101. setKeepOnAppending(true);
  102. }
  103.  
  104. @State
  105. public int getState() {
  106. return state;
  107. }
  108.  
  109. public void setState(@State int state) {
  110. if(state==getState())
  111. return;
  112. this.state = state;
  113. notifyWrapperAdapter();
  114. new Handler().post(new Runnable() {
  115. @Override
  116. public void run(){
  117. notifyDataSetChanged();
  118. }
  119. });
  120. }
  121.  
  122. @Override
  123. public int getItemCount() {
  124. switch (state) {
  125. case STATE_EMPTY:
  126. case STATE_ERROR: {
  127. dataPending.set(false);
  128. return 1;
  129. }
  130. case STATE_ENDLESS:
  131. default:
  132. return super.getItemCount() + (keepOnAppending.get() ? 1 : 0);
  133. }
  134. }
  135.  
  136. @Override
  137. public int getItemViewType(int position) {
  138. switch (state) {
  139. case STATE_EMPTY:
  140. return TYPE_EMPTY;
  141. case STATE_ERROR:
  142. return TYPE_ERROR;
  143. case STATE_ENDLESS:
  144. return TYPE_ENDLESS;
  145. default: {
  146. if (position == getWrappedAdapter().getItemCount())
  147. return TYPE_ENDLESS;
  148. return super.getItemViewType(position);
  149. }
  150. }
  151. }
  152.  
  153. @Override
  154. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  155. switch (viewType) {
  156. case TYPE_EMPTY:
  157. return new SimpleViewHolder(vEmptyView);
  158. case TYPE_ERROR:
  159. return new SimpleViewHolder(vErrorView);
  160. case TYPE_ENDLESS:
  161. return new SimpleViewHolder(vLoadingView);
  162. default:
  163. return super.onCreateViewHolder(parent, viewType);
  164. }
  165. }
  166.  
  167. @Override
  168. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  169. switch (state) {
  170. case STATE_EMPTY:
  171. case STATE_ERROR:
  172. onBindCViewHolder(holder, position);
  173. return;
  174. case STATE_ENDLESS:
  175. endlessRecycler();
  176. return;
  177. default:
  178. if (getItemViewType(position) == TYPE_ENDLESS)
  179. endlessRecycler();
  180. else
  181. super.onBindViewHolder(holder, position);
  182. }
  183. }
  184.  
  185. private void endlessRecycler()
  186. {
  187. if (!dataPending.get()) {
  188.  
  189. dataPending.set(true);
  190. requestToLoadMoreListener.processedResult(null, CallBackConstants.LOAD_MORE_METHOD);
  191. }
  192. }
  193.  
  194. private void onBindCViewHolder(RecyclerView.ViewHolder holder, int position) {
  195. }
  196.  
  197. private static class SimpleViewHolder extends RecyclerView.ViewHolder {
  198. SimpleViewHolder(View itemView) {
  199. super(itemView);
  200. }
  201. }
  202.  
  203.  
  204. public interface ProcessedResult {
  205. <IResponse,IMethod>void processedResult(IResponse iResponse, IMethod iMethod);
  206. }
  207. }
Add Comment
Please, Sign In to add comment