Pārlūkot izejas kodu

[회원가입][Bug] RecyclerView 를 dataBinding으로 구현

hyodong.min 7 gadi atpakaļ
vecāks
revīzija
04d7684cad

+ 24 - 10
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/FragmentBase.java

@@ -63,23 +63,27 @@ public abstract class FragmentBase extends Fragment {
   @Override
   public final void onStart() {
     super.onStart();
-  }
 
-  @Override
-  public final void onResume() {
-    super.onResume();
+    start();
   }
 
 //  @Override
-//  public final void onPause() {
-//    super.onPause();
+//  public final void onResume() {
+//    super.onResume();
 //  }
 //
 //  @Override
-//  public final void onStop() {
-//    super.onStop();
+//  public final void onPause() {
+//    super.onPause();
 //  }
-//
+
+  @Override
+  public final void onStop() {
+    super.onStop();
+
+    stop();
+  }
+
 //  @Override
 //  public final void onDestroyView() {
 //    super.onDestroyView();
@@ -106,8 +110,18 @@ public abstract class FragmentBase extends Fragment {
   protected abstract ViewModel defineViewModel();
 
   /**
-   * ActionBar를 정의 해준다.
+   * ActionBar 를 정의 해준다.
    */
   protected abstract void defineActionBar();
 
+  /**
+   * 시작. onStart() 에서 호출된다.
+   */
+  protected abstract void start();
+
+  /**
+   * 중지. onPause() 에서 호출된다.
+   */
+  protected abstract void stop();
+
 }

+ 10 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/LoginFragment.java

@@ -60,4 +60,14 @@ public class LoginFragment extends FragmentBase {
     actionBarManager.setDisplayHomeAsUpEnabled(true);
   }
 
+  @Override
+  protected void start() {
+
+  }
+
+  @Override
+  protected void stop() {
+
+  }
+
 }

+ 10 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/MainFragment.java

@@ -60,4 +60,14 @@ public class MainFragment extends FragmentBase {
 
   }
 
+  @Override
+  protected void start() {
+
+  }
+
+  @Override
+  protected void stop() {
+
+  }
+
 }

+ 14 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/signup/SignUpAdapter.java

@@ -1,6 +1,8 @@
 package kr.co.zumo.app.lifeplus.view.fragment.signup;
 
+import android.databinding.BindingAdapter;
 import android.databinding.DataBindingUtil;
+import android.databinding.ObservableList;
 import android.databinding.ViewDataBinding;
 import android.support.annotation.NonNull;
 import android.support.v7.widget.RecyclerView;
@@ -10,8 +12,6 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
 
-import com.google.gson.Gson;
-
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.databinding.SignUpAgreeBinding;
 import kr.co.zumo.app.databinding.SignUpButtonBinding;
@@ -48,6 +48,16 @@ public class SignUpAdapter extends RecyclerView.Adapter<BaseViewHolder> {
     return layout;
   }
 
+  @BindingAdapter("app:items")
+  public static void setSignUpItems(RecyclerView recyclerView, ObservableList<SignUpItem> items) {
+    SignUpAdapter adapter = (SignUpAdapter) recyclerView.getAdapter();
+    int len = items.size();
+    Log.i("APP# SignUpFragment | setSignUpItems", "|" + "adapter: " + adapter);
+    Log.i("APP# SignUpFragment | setSignUpItems", "|" + "items.size(): " + len);
+
+    adapter.notifyItemInserted(len - 1);
+  }
+
   @NonNull
   @Override
   public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -57,7 +67,7 @@ public class SignUpAdapter extends RecyclerView.Adapter<BaseViewHolder> {
     int alignType = item.getAlignType();
     View view;
     LayoutInflater inflater = LayoutInflater.from(parent.getContext());
-    Log.e("APP# SignUpAdapter | onCreateViewHolder", "| index: " + index + " viewType: " + viewType + ", alignType: " + alignType);
+//    Log.e("APP# SignUpAdapter | onCreateViewHolder", "| index: " + index + " viewType: " + viewType + ", alignType: " + alignType);
     switch (viewType) {
       case SignUpItem.SIGN_UP_TEXT:
         view = LayoutInflater.from(parent.getContext()).inflate(R.layout.sign_up_text_view, parent, false);
@@ -131,7 +141,7 @@ public class SignUpAdapter extends RecyclerView.Adapter<BaseViewHolder> {
     SignUpItem item = signUpViewModel.getItem(position);
     holder.draw(item);
     holder.align(item);
-    Log.w("APP# SignUpAdapter | onBindViewHolder", "|" + new Gson().toJson(item));
+//    Log.w("APP# SignUpAdapter | onBindViewHolder", "|" + new Gson().toJson(item));
   }
 
   @Override

+ 15 - 57
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/signup/SignUpFragment.java

@@ -14,25 +14,16 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-
 import kr.co.zumo.app.R;
+import kr.co.zumo.app.databinding.FragmentSignUpBinding;
 import kr.co.zumo.app.lifeplus.application.App;
 import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
 import kr.co.zumo.app.lifeplus.supervisor.FragmentChanger;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenChangerHelper;
-import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.fragment.FragmentBase;
 import kr.co.zumo.app.lifeplus.view.fragment.factory.BasicFragmentFactory;
-import kr.co.zumo.app.lifeplus.view.model.SignUpItem;
 import kr.co.zumo.app.lifeplus.view.model.SignUpViewModel;
 import kr.co.zumo.app.lifeplus.view.model.ViewModel;
-import kr.co.zumo.app.lifeplus.view.model.bean.SignUpBenefitBean;
-import kr.co.zumo.app.lifeplus.view.model.bean.SignUpBenefitListBean;
-import kr.co.zumo.app.lifeplus.view.model.bean.SignUpButtonBean;
-import kr.co.zumo.app.lifeplus.view.model.bean.SignUpTextWithTitleBean;
-import kr.co.zumo.app.lifeplus.view.model.bean.TextBean;
 
 /**
  * 회원 가입 화면
@@ -65,61 +56,18 @@ public class SignUpFragment extends FragmentBase {
     SignUpViewModel signUpViewModel = new SignUpViewModel(new FragmentChanger(helper.getFragmentActivity(), helper.getContainerId(), new BasicFragmentFactory()));
     adapter = new SignUpAdapter(signUpViewModel);
 
+    FragmentSignUpBinding binding = DataBindingUtil.getBinding(getView());
+
     RecyclerView recyclerView = getView().findViewById(R.id.sign_up_list);
     recyclerView.setHasFixedSize(true);
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(App.getInstance().getContext());
     recyclerView.setLayoutManager(layoutManager);
     recyclerView.setAdapter(adapter);
 
+    binding.setModel(signUpViewModel);
+
     viewModel = signUpViewModel;
 
-//    viewModel.setEventListener(new IViewModelEventListener<SignUpViewModel>() {
-//      @Override
-//      public void onEventFromViewModel(SignUpViewModel viewModel, int eventId, int intValue, @Nullable String stringValue) {
-//        switch (eventId) {
-//          case Event.CLICK:
-//            if (intValue == SignUpItem.BUTTON_ID_PIN) {
-//              // 핀 번호 입력 다이얼 로그 호출
-//              Log.i("APP# SignUpFragment | onEventFromViewModel", "| eventId: " + eventId + ", intValue: " + intValue);
-//            }
-//            break;
-//          default:
-//            break;
-//        }
-//      }
-//    });
-
-    // fixme for test
-
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_hello_text)).toJson()));
-
-    SignUpBenefitBean bean = new SignUpBenefitBean("1 번째 텍스트", R.drawable.common_full_open_on_phone, "benefit text1", "category text1");
-    SignUpBenefitBean bean2 = new SignUpBenefitBean("2 번째 텍스트", R.drawable.common_full_open_on_phone, "benefit text2", "category text2");
-    SignUpBenefitBean bean3 = new SignUpBenefitBean("3 번째 텍스트", R.drawable.common_full_open_on_phone, "benefit text3", "category text3");
-    ArrayList<SignUpBenefitBean> list = new ArrayList<>(Arrays.asList(bean, bean2, bean3));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_BENEFIT, SignUpItem.ALIGN_CENTER, new SignUpBenefitListBean(list).toJson()));
-
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean("본인인증").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_need_id)).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_END, new TextBean(ResourceUtil.getString(R.string.sign_up_mobile_confirm)).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT_WITH_TITLE, SignUpItem.ALIGN_START, new SignUpTextWithTitleBean(ResourceUtil.getString(R.string.sign_up_id_confirm_completed), "김한화, 남\n1982.02.20\n010-1234-5678").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean(ResourceUtil.getString(R.string.sign_up_input_pin)).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_need_pin)).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_BUTTON, SignUpItem.ALIGN_END, new SignUpButtonBean(ResourceUtil.getString(R.string.sign_up_input_pin), SignUpItem.BUTTON_ID_PIN).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_END, new TextBean(ResourceUtil.getString(R.string.sign_up_pin_confirm)).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_pin_confirm_completed)).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean("약관동의").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_AGREE, SignUpItem.ALIGN_START, new TextBean("SIGN_UP_WAITING").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_END, new TextBean(ResourceUtil.getString(R.string.sign_up_agree_completed)).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean("가입완료").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_completed, "한화")).toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_COIN, SignUpItem.ALIGN_START, new TextBean("가입 완료 코인 300c 지급 완료").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_TWO_BUTTON, SignUpItem.ALIGN_CENTER, new TextBean("two button").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_NOTICE, SignUpItem.ALIGN_CENTER, new TextBean("SIGN_UP_NOTICE").toJson()));
-    signUpViewModel.addItem(new SignUpItem(SignUpItem.SIGN_UP_WAITING, SignUpItem.ALIGN_CENTER, new TextBean("SIGN_UP_WAITING").toJson()));
-
-
-    adapter.notifyDataSetChanged();
     return viewModel;
   }
 
@@ -130,4 +78,14 @@ public class SignUpFragment extends FragmentBase {
     actionBarManager.setDisplayHomeAsUpEnabled(true);
   }
 
+  @Override
+  protected void start() {
+
+  }
+
+  @Override
+  protected void stop() {
+
+  }
+
 }

+ 46 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/model/SignUpViewModel.java

@@ -8,11 +8,21 @@ import android.databinding.ObservableList;
 import android.support.annotation.Nullable;
 import android.util.Log;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.manager.DialogManager;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenChanger;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.dialog.DialogID;
+import kr.co.zumo.app.lifeplus.view.model.bean.SignUpBenefitBean;
+import kr.co.zumo.app.lifeplus.view.model.bean.SignUpBenefitListBean;
+import kr.co.zumo.app.lifeplus.view.model.bean.SignUpButtonBean;
+import kr.co.zumo.app.lifeplus.view.model.bean.SignUpTextWithTitleBean;
+import kr.co.zumo.app.lifeplus.view.model.bean.TextBean;
 
 /**
  * 회원 가입 화면 ViewModel
@@ -35,6 +45,7 @@ public class SignUpViewModel extends ViewModel {
 
     signUpList = new ObservableArrayList<>();
 
+    prepareFlow();
   }
 
   @Override
@@ -54,6 +65,7 @@ public class SignUpViewModel extends ViewModel {
           // 핀 번호 입력 다이얼 로그 호출
           Log.i("APP# SignUpViewModel | onEvent", "| eventId: " + eventId + ", intValue: " + intValue);
           DialogManager.getInstance().show(SuperModel.getInstance().getCurrentFragment().getFragmentManager(), DialogID.PASSWORD);
+//          addItem(new SignUpItem(SignUpItem.SIGN_UP_WAITING, SignUpItem.ALIGN_CENTER, new TextBean("SIGN_UP_WAITING" + new Date().getTime()).toJson()));
         }
         break;
       default:
@@ -124,4 +136,38 @@ public class SignUpViewModel extends ViewModel {
     return currentIndex;
   }
 
+
+  private void prepareFlow() {
+
+    // fixme for test
+
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_hello_text)).toJson()));
+
+    SignUpBenefitBean bean = new SignUpBenefitBean("1 번째 텍스트", R.drawable.common_full_open_on_phone, "benefit text1", "category text1");
+    SignUpBenefitBean bean2 = new SignUpBenefitBean("2 번째 텍스트", R.drawable.common_full_open_on_phone, "benefit text2", "category text2");
+    SignUpBenefitBean bean3 = new SignUpBenefitBean("3 번째 텍스트", R.drawable.common_full_open_on_phone, "benefit text3", "category text3");
+    ArrayList<SignUpBenefitBean> list = new ArrayList<>(Arrays.asList(bean, bean2, bean3));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_BENEFIT, SignUpItem.ALIGN_CENTER, new SignUpBenefitListBean(list).toJson()));
+
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean("본인인증").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_need_id)).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_END, new TextBean(ResourceUtil.getString(R.string.sign_up_mobile_confirm)).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT_WITH_TITLE, SignUpItem.ALIGN_START, new SignUpTextWithTitleBean(ResourceUtil.getString(R.string.sign_up_id_confirm_completed), "김한화, 남\n1982.02.20\n010-1234-5678").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean(ResourceUtil.getString(R.string.sign_up_input_pin)).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_need_pin)).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_BUTTON, SignUpItem.ALIGN_END, new SignUpButtonBean(ResourceUtil.getString(R.string.sign_up_input_pin), SignUpItem.BUTTON_ID_PIN).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_END, new TextBean(ResourceUtil.getString(R.string.sign_up_pin_confirm)).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_pin_confirm_completed)).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean("약관동의").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_AGREE, SignUpItem.ALIGN_START, new TextBean("SIGN_UP_WAITING").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_END, new TextBean(ResourceUtil.getString(R.string.sign_up_agree_completed)).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_DIVIDER, new TextBean("가입완료").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TEXT, SignUpItem.ALIGN_START, new TextBean(ResourceUtil.getString(R.string.sign_up_completed, "한화")).toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_COIN, SignUpItem.ALIGN_START, new TextBean("가입 완료 코인 300c 지급 완료").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_TWO_BUTTON, SignUpItem.ALIGN_CENTER, new TextBean("two button").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_NOTICE, SignUpItem.ALIGN_CENTER, new TextBean("SIGN_UP_NOTICE").toJson()));
+    addItem(new SignUpItem(SignUpItem.SIGN_UP_WAITING, SignUpItem.ALIGN_CENTER, new TextBean("SIGN_UP_WAITING").toJson()));
+
+  }
+
 }

+ 14 - 1
app/src/main/res/layout/fragment_sign_up.xml

@@ -1,4 +1,16 @@
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:bind="http://schemas.android.com/tools">
+
+  <data>
+
+    <import type="kr.co.zumo.app.lifeplus.view.model.SignUpItem"/>
+
+    <variable
+      name="model"
+      type="kr.co.zumo.app.lifeplus.view.model.SignUpViewModel"/>
+
+  </data>
 
   <LinearLayout
     android:layout_width="match_parent"
@@ -9,6 +21,7 @@
       android:id="@+id/sign_up_list"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
+      app:items="@{model.getSignUpList()}"
       />
 
   </LinearLayout>