Advertisement
Guest User

Untitled

a guest
May 21st, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.15 KB | None | 0 0
  1. package com.dengun.libandroid;
  2.  
  3. import android.support.annotation.NonNull;
  4. import android.support.annotation.Nullable;
  5. import android.support.v7.util.DiffUtil;
  6. import android.support.v7.widget.RecyclerView;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9.  
  10. import java.util.ArrayList;
  11. import java.util.Arrays;
  12. import java.util.Collection;
  13. import java.util.List;
  14.  
  15. /**
  16. * Created by andre on 1/26/18.
  17. */
  18.  
  19. public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolderWrapper<?>> {
  20.  
  21. private ViewBinder viewBinder;
  22.  
  23. private boolean mWaitForUpdate;
  24.  
  25. private ArrayList<ViewProvider<Object>> providers = new ArrayList<>();
  26.  
  27. public BaseAdapter(ViewBinder... viewBinders) {
  28. if (viewBinders.length > 1) {
  29. this.viewBinder = new ViewBinder(viewBinders){};
  30. }else {
  31. this.viewBinder = viewBinders[0];
  32. }
  33. viewBinder.attachAdapter(this);
  34. }
  35.  
  36. @Override
  37. public int getItemViewType(int position) {
  38. ViewProvider provider = viewBinder.getViewProvider(position);
  39. if (provider.id == -1) {
  40. provider.id = providers.size();
  41. //noinspection unchecked
  42. providers.add(provider);
  43. }
  44. return provider.id;
  45. }
  46.  
  47. @NonNull
  48. @Override
  49. public ViewHolderWrapper onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  50. ViewProvider<?> provider = providers.get(viewType);
  51. return getViewHolderWrapper(parent, provider);
  52. }
  53.  
  54. @NonNull
  55. private <VW> ViewHolderWrapper getViewHolderWrapper(ViewGroup parent, ViewProvider<VW> provider) {
  56. VW viewWrapper = provider.newViewWrapper(parent);
  57. return new ViewHolderWrapper<>(viewWrapper, provider.getView(viewWrapper, parent));
  58. }
  59.  
  60. @Override
  61. public void onBindViewHolder(@NonNull ViewHolderWrapper holder, int position) {
  62. getViewBinder().bind1(holder.getViewWrapper(), position);
  63. }
  64.  
  65. @Override
  66. public void onViewRecycled(@NonNull ViewHolderWrapper<?> holder) {
  67. getViewBinder().unbind1(holder.getViewWrapper(), holder.getAdapterPosition());
  68. }
  69.  
  70. @Override
  71. public int getItemCount() {
  72. return mWaitForUpdate ? 0 : viewBinder.getCount();
  73. }
  74.  
  75. public final ViewBinder getViewBinder() {
  76. return viewBinder;
  77. }
  78.  
  79. public final void update() {
  80. getViewBinder().update();
  81. }
  82.  
  83. public void waitForUpdate() {
  84. mWaitForUpdate = true;
  85. }
  86.  
  87. public static class ViewHolderWrapper<VW> extends RecyclerView.ViewHolder {
  88.  
  89. private VW viewWrapper;
  90.  
  91. public ViewHolderWrapper(VW viewWrapper, View view) {
  92. super(view);
  93.  
  94. this.viewWrapper = viewWrapper;
  95. }
  96.  
  97. public VW getViewWrapper() {
  98. return viewWrapper;
  99. }
  100. }
  101.  
  102. public static abstract class ViewBinder<VW> {
  103.  
  104. private static List<ViewBinder> EMPTY = new ArrayList<>();
  105.  
  106. private int offset;
  107.  
  108. private List<ViewBinder> binders = EMPTY;
  109. private RecyclerView.Adapter adapter;
  110.  
  111. public ViewBinder(List<ViewBinder> binders) {
  112. setBinders(binders);
  113. }
  114.  
  115. public ViewBinder(ViewBinder... binders) {
  116. setBinders(binders);
  117. }
  118.  
  119. public final void setBinders(ViewBinder... providers) {
  120. this.binders = Arrays.asList(providers);
  121. }
  122.  
  123. public final void setBinders(Collection<ViewBinder> providers) {
  124. this.binders = new ArrayList<>(providers);
  125. }
  126.  
  127. public ViewBinder<?> getBinder(int position) {
  128. for (int i = binders.size() - 1; i >= 0; i--) {
  129. ViewBinder p = binders.get(i);
  130. if (p.offset <= position) {
  131. return p.getBinder(position - p.offset);
  132. }
  133. }
  134. return this;
  135. }
  136.  
  137. public int getCount() {
  138. int count = 0;
  139. for (ViewBinder provider : binders) {
  140. provider.offset = count;
  141. count += provider.getCount();
  142. }
  143. return count;
  144. }
  145.  
  146. @Nullable
  147. public final void update() {
  148. DiffUtil.Callback update = onUpdate();
  149. if (update == null) {
  150. adapter.notifyDataSetChanged();
  151. return;
  152. }
  153. DiffUtil
  154. .calculateDiff(update)
  155. .dispatchUpdatesTo(adapter);
  156. }
  157.  
  158. @Nullable
  159. protected DiffUtil.Callback onUpdate() {
  160. return null;
  161. }
  162.  
  163. private void bind1(Object viewWrapper, int position) {
  164. if (binders.isEmpty()) {
  165. //noinspection unchecked
  166. bind((VW) viewWrapper, position);
  167. return;
  168. }
  169. ViewBinder binder = getBinder(position);
  170. binder.bind1(viewWrapper, position - binder.offset);
  171. }
  172.  
  173. private void unbind1(Object viewWrapper, int position) {
  174. if (binders.isEmpty()) {
  175. //noinspection unchecked
  176. unbind((VW) viewWrapper);
  177. return;
  178. }
  179. ViewBinder binder = getBinder(position);
  180. binder.unbind1(viewWrapper, position - binder.offset);
  181. }
  182.  
  183. private ViewProvider<?> getViewProvider(int position) {
  184. if (binders.isEmpty()) {
  185. return getViewProvider();
  186. }
  187. //noinspection unchecked
  188. return getBinder(position).getViewProvider(position);
  189. }
  190.  
  191. protected ViewProvider<VW> getViewProvider() {
  192. return null;
  193. }
  194.  
  195. protected void bind(VW viewWrapper, int position) {
  196.  
  197. }
  198. protected void unbind(VW viewWrapper) {
  199.  
  200. }
  201.  
  202. public void attachAdapter(RecyclerView.Adapter adapter) {
  203. this.adapter = adapter;
  204. }
  205. }
  206.  
  207. public static abstract class ViewProvider<VW> {
  208.  
  209. private int id = -1;
  210.  
  211. protected abstract VW newViewWrapper(ViewGroup parent);
  212. protected abstract View getView(VW vw, ViewGroup parent);
  213. }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement