Ver código fonte

[검색][New] SingleSelector refactoring

hyodong.min 7 anos atrás
pai
commit
f9f6046afa

+ 13 - 10
app/src/main/java/kr/co/zumo/app/lifeplus/view/SingleSelector.java

@@ -57,18 +57,20 @@ public class SingleSelector {
   /**
    * 하나만 선택 한다.
    *
-   * @param box
+   * @param trigger
    */
-  public void check(Checkable box) {
+  public void check(Checkable trigger, boolean isTriggerChecked) {
     // 리스트에 속한 박스라면 다른 박스를 해제 시킨다.
-    if (boxes.indexOf(box) > -1) {
+    if (boxes.indexOf(trigger) > -1) {
       List<Checkable> list = new ArrayList<>();
-      for (Checkable checkable : boxes) {
-        if (box != checkable) {
-          list.add(checkable);
+      if (isTriggerChecked) {
+        for (Checkable checkable : boxes) {
+          if (trigger != checkable) {
+            list.add(checkable);
+          }
         }
       }
-      this.listener.onCheckChanged(box, list);
+      this.listener.onChecked(trigger, isTriggerChecked, list);
     }
   }
 
@@ -85,7 +87,7 @@ public class SingleSelector {
           list.add(checkable);
         }
       }
-      this.listener.onCheckChanged(null, list);
+      this.listener.onUnchecked(list);
     }
   }
 
@@ -106,7 +108,8 @@ public class SingleSelector {
     boxes = null;
   }
 
-  public static interface Listener {
-    void onCheckChanged(Checkable checked, List<Checkable> unchecked);
+  public interface Listener {
+    void onChecked(Checkable trigger, boolean isTriggerChecked, List<Checkable> unchecked);
+    void onUnchecked(List<Checkable> unchecked);
   }
 }

+ 40 - 45
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/SearchFilterDetailDialog.java

@@ -121,12 +121,21 @@ public class SearchFilterDetailDialog extends DialogBase<ISearchFilterListener<S
     filterMap = new HashMap<>();
 
     // 하나만 선택 할 수 있도록
-    SingleSelector selector = new SingleSelector((checked, unchecked) -> {
-      if (null != checked) {
-        setSelected(checked, true);
+    SingleSelector selector = new SingleSelector(new SingleSelector.Listener() {
+      @Override
+      public void onChecked(Checkable trigger, boolean isTriggerChecked, List<Checkable> unchecked) {
+        setSelected(trigger, isTriggerChecked);
+
+        for (Checkable checkable : unchecked) {
+          setSelected(checkable, false);
+        }
       }
-      for (Checkable checkable : unchecked) {
-        setSelected(checkable, false);
+
+      @Override
+      public void onUnchecked(List<Checkable> unchecked) {
+        for (Checkable checkable : unchecked) {
+          setSelected(checkable, false);
+        }
       }
     });
 
@@ -148,23 +157,7 @@ public class SearchFilterDetailDialog extends DialogBase<ISearchFilterListener<S
 
         filterMap.put(checkBoxAll, tagBean);
 
-        if (isMultiSelection) {
-          checkBoxAll.setOnClickListener(v -> {
-            setSelected((Checkable) v, true);
-          });
-        }
-        else {
-          selector.addChildBox(checkBoxAll);
-          checkBoxAll.setOnClickListener(v -> {
-            if (selector.contains((Checkable) v)) {
-              // 셀렉터에 포함되있으면 셀렉터에서 처리
-              selector.check((Checkable) v);
-            }
-            else {
-              setSelected((Checkable) v, true);
-            }
-          });
-        }
+        attachEvent(checkBoxAll, selector);
 
         // 선택 표시
         checkBoxAll.setChecked(tagBean.isSelected());
@@ -192,29 +185,7 @@ public class SearchFilterDetailDialog extends DialogBase<ISearchFilterListener<S
         // 핫플레이스는 filter name, 지역은 tagNo 를 api 에 이용한다.
         filterMap.put(checkBox, tagBean);
 
-        if (isMultiSelection) {
-          checkBox.setOnClickListener(v -> {
-            setSelected((Checkable) v, true);
-          });
-        }
-        else {
-          selector.addChildBox(checkBox);
-          checkBox.setOnClickListener(v -> {
-            Checkable cb = (Checkable) v;
-            if (selector.contains(cb)) {
-              if (cb.isChecked()) {
-                // 셀렉터에 포함되있으면 셀렉터에서 처리
-                selector.check(cb);
-              }
-              else {
-                setSelected(cb, false);
-              }
-            }
-            else {
-              setSelected(cb, cb.isChecked());
-            }
-          });
-        }
+        attachEvent(checkBox, selector);
 
         // 선택 표시
         checkBox.setChecked(tagBean.isSelected());
@@ -231,6 +202,30 @@ public class SearchFilterDetailDialog extends DialogBase<ISearchFilterListener<S
     container.addView(space, layoutParams);
   }
 
+  private void attachEvent(CustomCheckBox checkBox, SingleSelector selector) {
+
+    if (isMultiSelection) {
+      checkBox.setOnClickListener(v -> {
+        Checkable cb = (Checkable) v;
+        setSelected((Checkable) v, cb.isChecked());
+      });
+    }
+    else {
+      selector.addChildBox(checkBox);
+      checkBox.setOnClickListener(v -> {
+        Checkable cb = (Checkable) v;
+        if (selector.contains(cb)) {
+          // 셀렉터에 포함되있으면 셀렉터에서 처리
+          selector.check(cb, cb.isChecked());
+        }
+        else {
+          setSelected(cb, cb.isChecked());
+        }
+      });
+    }
+
+  }
+
   private void setSelected(Checkable checkBox, boolean isCheck) {
     FilterTagBean tagBean = filterMap.get(checkBox);
     checkBox.setChecked(isCheck);

+ 15 - 13
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/SearchFilterSection.java

@@ -68,13 +68,21 @@ public class SearchFilterSection {
     List<SearchFilterBean> filterBeans = sectionBean.getFilterBeans();
     if (null != filterBeans && filterBeans.size() > 0) {
 
-      SingleSelector selector = new SingleSelector((checked, unchecked) -> {
-        if (null != checked) {
-          setSelected(checked, true);
+      SingleSelector selector = new SingleSelector(new SingleSelector.Listener() {
+        @Override
+        public void onChecked(Checkable trigger, boolean isTriggerChecked, List<Checkable> unchecked) {
+          setSelected(trigger, isTriggerChecked);
+
+          for (Checkable checkable : unchecked) {
+            setSelected(checkable, false);
+          }
         }
 
-        for (Checkable checkable : unchecked) {
-          setSelected(checkable, false);
+        @Override
+        public void onUnchecked(List<Checkable> unchecked) {
+          for (Checkable checkable : unchecked) {
+            setSelected(checkable, false);
+          }
         }
       });
 
@@ -98,7 +106,6 @@ public class SearchFilterSection {
           driver = new SearchFilterParentCheckDriver(checkBox, filterBean);
 
           checkBox.setOnClickListener(v -> {
-
             // 우선 체크한 상태로 표시
             checkBox.setChecked(true);
 
@@ -125,13 +132,8 @@ public class SearchFilterSection {
           checkBox.setOnClickListener(v -> {
             Checkable cb = (Checkable) v;
             if (selector.contains(driver)) {
-              if (cb.isChecked()) {
-                // 셀렉터에 포함되있으면 셀렉터에서 처리
-                selector.check(driver);
-              }
-              else {
-                setSelected(driver, false);
-              }
+              // 셀렉터에 포함되있으면 셀렉터에서 처리
+              selector.check(driver, cb.isChecked());
             }
             else {
               setSelected(driver, cb.isChecked());