Browse Source

[카테고리][New] 페이징 + overScroll 병합

hyodong.min 6 years ago
parent
commit
a96fe1c76c

+ 69 - 37
app/src/main/java/kr/co/zumo/app/lifeplus/view/OverScrollDriver.java

@@ -24,12 +24,23 @@ import me.everything.android.ui.overscroll.OverScrollDecoratorHelper;
  */
 public class OverScrollDriver {
 
-  private boolean isCollapsed = false;
+  private static final int COLLAPSED = 0;
+  private static final int EXPENDED = 1;
+  private static final int NONE = -1;
+  private static final int IDLE = 2;
+
+  private int collapsedStatus = EXPENDED;
   private IOverScrollDecor overScrollDecor;
 
   private RecyclerView recyclerView;
   private AppBarLayout appBarLayout;
   private AppBarLayout.OnOffsetChangedListener listener;
+  private IOverScrollStateListener overScrollStateListener;
+
+  public OverScrollDriver(RecyclerView recyclerView, AppBarLayout appBarLayout, IOverScrollStateListener overScrollStateListener) {
+    this(recyclerView, appBarLayout);
+    this.overScrollStateListener = overScrollStateListener;
+  }
 
   public OverScrollDriver(RecyclerView recyclerView, AppBarLayout appBarLayout) {
     this.recyclerView = recyclerView;
@@ -40,16 +51,22 @@ public class OverScrollDriver {
 
   private void init() {
     listener = (appBarLayout, verticalOffset) -> {
-//      Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " offset: " + verticalOffset);
-//      Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " range: " + appBarLayout.getTotalScrollRange());
+      Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " offset: " + verticalOffset);
+      Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " range: " + appBarLayout.getTotalScrollRange());
+
+      if (collapsedStatus == NONE) {
+        Log.d("APP# OverScrollDriver | init", "|" + " collapsedStatus == NONE");
+        return;
+      }
+
       if (verticalOffset == 0) {
         // 커진 상태
-        isCollapsed = false;
+        collapsedStatus = EXPENDED;
         attachOverScroll();
       }
       else {
         // 줄어든 상태
-        isCollapsed = true;
+        collapsedStatus = COLLAPSED;
 
         if (-verticalOffset == appBarLayout.getTotalScrollRange()) {
           attachOverScroll();
@@ -61,6 +78,21 @@ public class OverScrollDriver {
     appBarLayout.addOnOffsetChangedListener(listener);
   }
 
+  /**
+   * 접히는 상태를 NONE 으로 만들면 상태 변경이 되지않아 이벤트가 attach/detach 되지 않는다.
+   */
+  public void setCollapsedStatusNone() {
+    collapsedStatus = NONE;
+    attachOverScroll();
+  }
+
+  /**
+   * 접히는 상태를 반영한다.
+   */
+  public void setCollapsedStatusIdle() {
+    collapsedStatus = IDLE;
+  }
+
   /**
    * dispose
    */
@@ -86,40 +118,40 @@ public class OverScrollDriver {
     if (null == overScrollDecor) {
       Log.d("APP# OverScrollDriver | attachOverScroll", "|" + " attach_______________");
       overScrollDecor = OverScrollDecoratorHelper.setUpOverScroll(recyclerView, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);
-      overScrollDecor.setOverScrollStateListener(new IOverScrollStateListener() {
-        @Override
-        public void onOverScrollStateChange(IOverScrollDecor decor, int oldState, int newState) {
-          switch (newState) {
-            case IOverScrollState.STATE_IDLE:
-              // No over-scroll is in effect.
-              Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "idle");
-              break;
-            case IOverScrollState.STATE_DRAG_START_SIDE:
-              // Dragging started at the left-end.
-              if (isCollapsed) {
-                detachOverScroll();
-              }
-              break;
-            case IOverScrollState.STATE_DRAG_END_SIDE:
-              // Dragging started at the right-end.
-              if (false == isCollapsed) {
-                detachOverScroll();
-              }
-              break;
-            case IOverScrollState.STATE_BOUNCE_BACK:
-              Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "bounce back --> " + oldState);
-              if (oldState == IOverScrollState.STATE_DRAG_START_SIDE) {
-                // Dragging stopped -- view is starting to bounce back from the *left-end* onto natural position.
-              }
-              else { // i.e. (oldState == STATE_DRAG_END_SIDE)
-                // View is starting to bounce back from the *right-end*.
-              }
-              break;
-            default:
-              break;
-          }
+      overScrollDecor.setOverScrollStateListener((decor, oldState, newState) -> {
+        switch (newState) {
+          case IOverScrollState.STATE_IDLE:
+            // No over-scroll is in effect.
+            Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "idle");
+            break;
+          case IOverScrollState.STATE_DRAG_START_SIDE:
+            // Dragging started at the left-end.
+            if (collapsedStatus == COLLAPSED) {
+              detachOverScroll();
+            }
+            break;
+          case IOverScrollState.STATE_DRAG_END_SIDE:
+            // Dragging started at the right-end.
+            if (collapsedStatus == EXPENDED) {
+              detachOverScroll();
+            }
+            break;
+          case IOverScrollState.STATE_BOUNCE_BACK:
+            Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "bounce back --> " + oldState);
+            if (oldState == IOverScrollState.STATE_DRAG_START_SIDE) {
+              // Dragging stopped -- view is starting to bounce back from the *left-end* onto natural position.
+            }
+            else { // i.e. (oldState == STATE_DRAG_END_SIDE)
+              // View is starting to bounce back from the *right-end*.
+            }
+            break;
+          default:
+            break;
         }
 
+        if (null != overScrollStateListener) {
+          overScrollStateListener.onOverScrollStateChange(decor, oldState, newState);
+        }
       });
 
       overScrollDecor.getView().setTranslationY(0);

+ 8 - 37
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/category/CategoryMainFragment.java

@@ -33,10 +33,7 @@ import kr.co.zumo.app.lifeplus.view.custom.category.series.IMainSeriesContract;
 import kr.co.zumo.app.lifeplus.view.custom.category.series.MainSeriesPresenter;
 import kr.co.zumo.app.lifeplus.view.custom.category.series.MainSeriesView;
 import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
-import me.everything.android.ui.overscroll.IOverScrollDecor;
 import me.everything.android.ui.overscroll.IOverScrollState;
-import me.everything.android.ui.overscroll.IOverScrollStateListener;
-import me.everything.android.ui.overscroll.OverScrollDecoratorHelper;
 
 /**
  * CategoryMainFragment
@@ -63,7 +60,6 @@ public abstract class CategoryMainFragment<P extends CategoryMainPresenter> exte
   protected ImageView imageViewContentsNothing;
   protected TextView textViewContentsNothing;
   protected Toolbar toolbar;
-  protected IOverScrollDecor overScrollDecor;
   private OverScrollDriver overScrollDriver;
 
   protected IMainSeriesContract.Presenter seriesPresenter;
@@ -94,6 +90,7 @@ public abstract class CategoryMainFragment<P extends CategoryMainPresenter> exte
     spinnerOrder = findViewById(R.id.spinner_select_contents);
     spinnerOrder.setAdapter(arrayAdapter);
     imageViewFilter = findViewById(R.id.first_category_main_filter);
+
     init();
 
     imageViewFilter.setOnClickListener(view -> {
@@ -115,39 +112,14 @@ public abstract class CategoryMainFragment<P extends CategoryMainPresenter> exte
       public void onNothingSelected(AdapterView<?> parent) {}
     });
 
-    overScrollDecor = OverScrollDecoratorHelper.setUpOverScroll(recyclerView, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);
-    overScrollDecor.setOverScrollStateListener(new IOverScrollStateListener() {
-      @Override
-      public void onOverScrollStateChange(IOverScrollDecor decor, int oldState, int newState) {
-        switch (newState) {
-          case IOverScrollState.STATE_IDLE:
-            // No over-scroll is in effect.
-            Log.d("APP# CategoryMainFragment | onOverScrollStateChange", "|" + "idle");
-            break;
-          case IOverScrollState.STATE_DRAG_START_SIDE:
-            // Dragging started at the left-end.
-            break;
-          case IOverScrollState.STATE_DRAG_END_SIDE:
-            // Dragging started at the right-end.
-            break;
-          case IOverScrollState.STATE_BOUNCE_BACK:
-            Log.d("APP# CategoryMainFragment | onOverScrollStateChange", "|" + "bounce back --> " + oldState);
-            if (oldState == IOverScrollState.STATE_DRAG_START_SIDE) {
-              // Dragging stopped -- view is starting to bounce back from the *left-end* onto natural position.
-            }
-            else { // i.e. (oldState == STATE_DRAG_END_SIDE)
-              // View is starting to bounce back from the *right-end*.
-              presenter.onOverScrollEnd();
-            }
-            break;
-          default:
-            break;
-        }
+    overScrollDriver = new OverScrollDriver(recyclerView, appBarLayout, (decor, oldState, newState) -> {
+      Log.d("APP# CategoryMainFragment | onOverScrollStateChange", "|" + "bounce back --> " + oldState);
+      if (newState == IOverScrollState.STATE_BOUNCE_BACK && oldState == IOverScrollState.STATE_DRAG_END_SIDE) {
+        // View is starting to bounce back from the *right-end*.
+        presenter.onOverScrollEnd();
       }
-
     });
-
-    overScrollDriver = new OverScrollDriver(recyclerView, appBarLayout);
+    overScrollDriver.setCollapsedStatusNone();
   }
 
   @Override
@@ -169,8 +141,6 @@ public abstract class CategoryMainFragment<P extends CategoryMainPresenter> exte
   @Override
   protected final void onAfterDestroyView() {
 
-    overScrollDecor.setOverScrollStateListener(null);
-
     getHelper(ActionBarHelper.class).setTitleClickListener(null);
 
     onAfterDestroyViewInternal();
@@ -237,6 +207,7 @@ public abstract class CategoryMainFragment<P extends CategoryMainPresenter> exte
   public void showRecommendArea() {
     mainSeriesView.setVisibility(View.VISIBLE);
     space.setVisibility(View.GONE);
+    overScrollDriver.setCollapsedStatusIdle();
   }
 
   @Override