فهرست منبع

[메인][Bug] 스크롤 버그 수정

hyodong.min 7 سال پیش
والد
کامیت
7c2cb6b437

+ 20 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsAdapter.java

@@ -11,6 +11,9 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import kr.co.zumo.app.R;
 
 /**
@@ -28,6 +31,8 @@ public class MainContentsAdapter extends RecyclerView.Adapter<MainContentsView>
   public static final int VIEW_TYPE_WEATHER = 0;
   public static final int VIEW_TYPE_CATEGORY = 1;
 
+  private List<MainContentsView> holders;
+
   private Context context;
   private LayoutInflater inflater;
 //  private RecyclerView recyclerView;
@@ -36,6 +41,7 @@ public class MainContentsAdapter extends RecyclerView.Adapter<MainContentsView>
     this.context = context;
     this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
+    holders = new ArrayList<>();
   }
 
 //  @Override
@@ -43,6 +49,13 @@ public class MainContentsAdapter extends RecyclerView.Adapter<MainContentsView>
 //    super.onAttachedToRecyclerView(recyclerView);
 //
 //    this.recyclerView = recyclerView;
+//  }
+
+//
+//  @Override
+//  public void onViewDetachedFromWindow(@NonNull MainContentsView holder) {
+//    Log.i("APP# MainContentsAdapter | onViewDetachedFromWindow", "|" + holder);
+//    holder.dispose();
 //  }
 
   @NonNull
@@ -61,6 +74,7 @@ public class MainContentsAdapter extends RecyclerView.Adapter<MainContentsView>
         holder = new MainContentsCategoryView(context, view);
         break;
     }
+    holders.add(holder);
     return holder;
   }
 
@@ -99,4 +113,10 @@ public class MainContentsAdapter extends RecyclerView.Adapter<MainContentsView>
     }
   }
 
+  public void dispose() {
+    for (MainContentsView holder : holders) {
+      holder.dispose();
+    }
+  }
+
 }

+ 4 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsCategoryView.java

@@ -32,4 +32,8 @@ public class MainContentsCategoryView extends MainContentsView {
   public void init() {
 
   }
+  
+  @Override
+  public void dispose() {
+  }
 }

+ 5 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsView.java

@@ -46,4 +46,9 @@ public abstract class MainContentsView extends RecyclerView.ViewHolder {
    * 초기화
    */
   public abstract void init();
+
+  /**
+   * dispose
+   */
+  public abstract void dispose();
 }

+ 16 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainContentsWeatherView.java

@@ -33,11 +33,11 @@ public class MainContentsWeatherView extends MainContentsView implements ViewTre
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
 
     // 초기 위치가 설정된 후 작동
-    if (0 < initY) {
+    if (0 <= initY) {
       // 현재 위치 - 전체 뷰
-      int cy = getScreenY(itemView);
+      float cy = itemView.getY(); //getScreenY(itemView);
       // 초기 위치와의 차이( -값 )
-      int gap = cy - initY;
+      float gap = cy - initY;
 
       float ty;
       // 고정 되는 영역에서는 차이 값만큼 이동, 이때는 제자리에 머물러 있는 것처럼 보임
@@ -54,7 +54,7 @@ public class MainContentsWeatherView extends MainContentsView implements ViewTre
   }
 
   private int weatherArea = -ResourceUtil.dpToPx(100);
-  private int initY;
+  private float initY = -8969;
   private float initWeatherY;
   private ViewGroup weather;
 
@@ -65,6 +65,13 @@ public class MainContentsWeatherView extends MainContentsView implements ViewTre
     itemView.getViewTreeObserver().addOnGlobalLayoutListener(this);
   }
 
+  @Override
+  public void dispose() {
+    Log.i("APP#  MainContentsWeatherView | dispose", "|" + " this: " + this);
+    itemView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+    weather = null;
+  }
+
   private int getScreenY(View view) {
     int containerPos[] = new int[2];
     view.getLocationOnScreen(containerPos);
@@ -74,10 +81,10 @@ public class MainContentsWeatherView extends MainContentsView implements ViewTre
 
   @Override
   public void onGlobalLayout() {
-    itemView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-    initWeatherY = weather.getY();
-    initY = MainContentsWeatherView.this.getScreenY(itemView);
-    Log.i("APP# MainContentsWeatherView | init", "|" + " initWeatherY: " + initWeatherY);
-    Log.i("APP# MainContentsWeatherView | init", "|" + " initY: " + initY);
+    if (null != weather) {
+      initWeatherY = weather.getY();
+      initY = itemView.getY(); //getScreenY(itemView);
+      Log.i("APP# MainContentsWeatherView | init", "|" + " initY: " + initY + " initWeatherY: " + initWeatherY + ", this: " + this);
+    }
   }
 }

+ 13 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/main/MainFragment.java

@@ -38,6 +38,8 @@ import kr.co.zumo.app.lifeplus.view.presenter.MainPresenter;
 public class MainFragment extends FragmentBase<MainPresenter> implements IMainView {
 
   private RecyclerView contentsRecyclerView;
+  private MainContentsAdapter adapter;
+
 
   @Nullable
   @Override
@@ -51,7 +53,7 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     contentsRecyclerView = findViewById(R.id.recycler_view_main);
     contentsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
 
-    MainContentsAdapter adapter = new MainContentsAdapter(getContext());
+    adapter = new MainContentsAdapter(getContext());
     contentsRecyclerView.setAdapter(adapter);
     contentsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
       @Override
@@ -153,6 +155,16 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     ((TextView) findViewById(R.id.text_version)).setText("앱 버젼: " + AppUtil.getVersionName());
   }
 
+  @Override
+  public void onDestroyView() {
+    super.onDestroyView();
+
+    if(null != adapter) {
+      adapter.dispose();
+      adapter = null;
+    }
+  }
+
   @Override
   protected void defineActionBar() {
     ActionBarManager actionBarManager = ActionBarManager.getInstance();