浏览代码

[메인][New] 콘텐츠 제목 스크롤 연동
- 기본 작동은 RecyclerView 스크롤 이벤트로 처리
- AppBarLayout 스크롤은 별도로 등록하여 처리해줌

hyodong.min 7 年之前
父节点
当前提交
d6c6f4e856

+ 5 - 6
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsAdapter.java

@@ -6,7 +6,6 @@ package kr.co.zumo.app.lifeplus.view.fragment.main;
 import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.v7.widget.RecyclerView;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -81,7 +80,7 @@ public class MainContentsAdapter extends RecyclerView.Adapter<MainContentsView>
   @Override
   public void onBindViewHolder(@NonNull MainContentsView holder, int position) {
     // 화면에 표실 될 때
-    Log.i("APP# MainContentsAdapter | onBindViewHolder", "|" + " holder: " + holder + ", position: " + position);
+//    Log.i("APP# MainContentsAdapter | onBindViewHolder", "|" + " holder: " + holder + ", position: " + position);
 
     holder.init();
   }
@@ -106,10 +105,10 @@ public class MainContentsAdapter extends RecyclerView.Adapter<MainContentsView>
   }
 
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-    MainContentsView holder = (MainContentsView) recyclerView.findViewHolderForAdapterPosition(0);
-
-    if (null != holder) {
-      holder.onScrolled(recyclerView, dx, dy);
+    for (MainContentsView holder : holders) {
+      if (null != holder) {
+        holder.onScrolled(recyclerView, dx, dy);
+      }
     }
   }
 

+ 7 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsCategoryAdapter.java

@@ -6,7 +6,6 @@ package kr.co.zumo.app.lifeplus.view.fragment.main;
 import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.v7.widget.RecyclerView;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -95,7 +94,7 @@ public class MainContentsCategoryAdapter extends RecyclerView.Adapter<MainConten
   @Override
   public void onBindViewHolder(@NonNull MainContentsView holder, int position) {
     // 화면에 표실 될 때
-    Log.i("APP# MainContentsAdapter | onBindViewHolder", "|" + " holder: " + holder + ", position: " + position);
+//    Log.i("APP# MainContentsCategoryAdapter | onBindViewHolder", "|" + " holder: " + holder + ", position: " + position);
 
     holder.init();
   }
@@ -122,7 +121,13 @@ public class MainContentsCategoryAdapter extends RecyclerView.Adapter<MainConten
     return type;
   }
 
+
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+    for (MainContentsView holder : holders) {
+      if (null != holder) {
+        holder.onScrolled(recyclerView, dx, dy);
+      }
+    }
   }
 
   public void dispose() {

+ 49 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsCategoryImageView.java

@@ -6,6 +6,10 @@ package kr.co.zumo.app.lifeplus.view.fragment.main;
 import android.content.Context;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
+import android.widget.TextView;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 
 /**
  * MainContentsCategoryImageView
@@ -19,18 +23,63 @@ import android.view.View;
  */
 public class MainContentsCategoryImageView extends MainContentsView {
 
+
+  private TextView textBig;
+  private TextView textSmall;
+
   public MainContentsCategoryImageView(Context context, View view) {
     super(context, view);
   }
 
   @Override
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+    onScrolledInternal();
+  }
+
+  private void onScrolledInternal() {
+    /**
+     * 화면 높이 - 71 보다 아래에 있으면 해당 위치까지 위치시키고,
+     * 내부의 위치가 152보다 높으면 제한
+     */
 
+    if (null != textBig) {
+      int cy = getScreenY(textBig);
+      int screenHeight = 1860; // temp
+
+      // 적당한 위치에 있을 때만 처리한다.
+      if (cy > 0 && cy < screenHeight << 2) {
+        int ty = screenHeight - ResourceUtil.dpToPx(71);
+        int gap = ty - cy;
+//        Log.i("APP# MainContentsCategoryImageView | onScrolled", "|" + " cy: " + cy + ", ty: " + ty + ", gap: " + gap + ", this:" + this.hashCode());
+
+        int y = (int) (textBig.getY() + gap);
+        // 뷰 영역 안에서만 이동 가능
+        int max = ResourceUtil.dpToPx(218);
+        int min = -400;   // 위쪽으로 사라지도록 0 보다 작은 값
+        if (y > max) {
+          y = max;
+        }
+        else if (y < min) {
+          y = min;
+        }
+        textBig.setY(y);
+      }
+    }
   }
 
   @Override
   public void init() {
+    textBig = itemView.findViewById(R.id.text_big);
+    textSmall = itemView.findViewById(R.id.text_small);
+
+    onScrolledInternal();
+  }
+
+  private int getScreenY(View view) {
+    int containerPos[] = new int[2];
+    view.getLocationOnScreen(containerPos);
 
+    return containerPos[1];
   }
 
   @Override

+ 14 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsCategoryView.java

@@ -31,7 +31,9 @@ public class MainContentsCategoryView extends MainContentsView {
 
   @Override
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-
+    if(null != adapter) {
+      adapter.onScrolled(recyclerView, dx, dy);
+    }
   }
 
   @Override
@@ -44,9 +46,20 @@ public class MainContentsCategoryView extends MainContentsView {
     adapter = new MainContentsCategoryAdapter(context);
     recyclerView.setAdapter(adapter);
     recyclerView.setNestedScrollingEnabled(false);
+
+    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+      @Override
+      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+        adapter.onScrolled(recyclerView, dx, dy);
+      }
+    });
   }
 
   @Override
   public void dispose() {
+    if (null != adapter) {
+      adapter.dispose();
+      adapter = null;
+    }
   }
 }

+ 22 - 6
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainFragment.java

@@ -6,6 +6,7 @@ package kr.co.zumo.app.lifeplus.view.fragment.main;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.design.widget.AppBarLayout;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
@@ -16,6 +17,7 @@ import android.widget.TextView;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
+import kr.co.zumo.app.lifeplus.manager.IActionBarListener;
 import kr.co.zumo.app.lifeplus.model.MainModel;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.util.AppUtil;
@@ -40,6 +42,19 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
   private RecyclerView contentsRecyclerView;
   private MainContentsAdapter adapter;
 
+  private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
+    @Override
+    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+      adapter.onScrolled(recyclerView, dx, dy);
+    }
+  };
+
+  private IActionBarListener.Scroll actionBarScrollListener = new IActionBarListener.Scroll() {
+    @Override
+    public void onScroll(AppBarLayout appBarLayout, int verticalOffset) {
+      adapter.onScrolled(contentsRecyclerView, verticalOffset, verticalOffset);
+    }
+  };
 
   @Nullable
   @Override
@@ -55,12 +70,9 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
 
     adapter = new MainContentsAdapter(getContext());
     contentsRecyclerView.setAdapter(adapter);
-    contentsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
-      @Override
-      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-        adapter.onScrolled(recyclerView, dx, dy);
-      }
-    });
+    contentsRecyclerView.addOnScrollListener(scrollListener);
+
+    ActionBarManager.getInstance().setScrollListener(actionBarScrollListener);
 
     // --------------- test ------------------
 
@@ -168,6 +180,10 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
       adapter.dispose();
       adapter = null;
     }
+
+    contentsRecyclerView.removeOnScrollListener(scrollListener);
+
+    ActionBarManager.getInstance().setScrollListener(null);
   }
 
   @Override

+ 0 - 1
app/src/main/res/layout/main_contents_category_image.xml

@@ -22,7 +22,6 @@
     android:textColor="#ffffff"
     android:textSize="19sp"
     android:textStyle="bold"
-    app:layout_constraintBottom_toTopOf="@+id/text_small"
     app:layout_constraintStart_toStartOf="parent"/>
 
   <TextView