Pārlūkot izejas kodu

[검색][New] 태그 기능 추가

hyodong.min 7 gadi atpakaļ
vecāks
revīzija
661d919a2d

+ 32 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/TagCheckBean.java

@@ -0,0 +1,32 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.bean.api;
+
+/**
+ * TagCheckBean
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019. 1. 17.]   [최초 작성]
+ * @since 2019. 1. 17.
+ */
+public class TagCheckBean extends TagBean {
+
+  private boolean isChecked = false;
+
+  public TagCheckBean(String tagName, boolean isChecked) {
+    super(tagName);
+    this.isChecked = isChecked;
+  }
+
+  public boolean isChecked() {
+    return isChecked;
+  }
+
+  public void setChecked(boolean checked) {
+    isChecked = checked;
+  }
+}

+ 2 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/ISearchResultView.java

@@ -6,7 +6,7 @@ package kr.co.zumo.app.lifeplus.view.screen.search;
 import java.util.List;
 
 import kr.co.zumo.app.lifeplus.bean.api.SearchContentsBean;
-import kr.co.zumo.app.lifeplus.bean.api.TagBean;
+import kr.co.zumo.app.lifeplus.bean.api.TagCheckBean;
 import kr.co.zumo.app.lifeplus.view.IView;
 
 /**
@@ -24,5 +24,5 @@ interface ISearchResultView extends IView {
 
   void setVisibleCategory(boolean isVisible);
 
-  void drawTags(String[] deliveredTags, List<TagBean> tagBeans);
+  void drawTags(List<TagCheckBean> tagBeans);
 }

+ 3 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultFragment.java

@@ -17,7 +17,7 @@ import java.util.List;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.api.SearchContentsBean;
-import kr.co.zumo.app.lifeplus.bean.api.TagBean;
+import kr.co.zumo.app.lifeplus.bean.api.TagCheckBean;
 import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
 import kr.co.zumo.app.lifeplus.helper.NavigationBar;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
@@ -121,9 +121,9 @@ public class SearchResultFragment extends FragmentBase<SearchResultPresenter> im
   }
 
   @Override
-  public void drawTags(String[] deliveredTags, List<TagBean> tagBeans) {
+  public void drawTags(List<TagCheckBean> tagBeans) {
     if (null == tagAdapter) {
-      tagAdapter = new SearchResultTagAdapter(deliveredTags, tagBeans, event -> {
+      tagAdapter = new SearchResultTagAdapter(tagBeans, event -> {
         presenter.onEvent(event);
       });
       recyclerViewTags.setAdapter(tagAdapter);

+ 89 - 33
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultModel.java

@@ -16,6 +16,7 @@ import kr.co.zumo.app.lifeplus.bean.api.SearchContentsBean;
 import kr.co.zumo.app.lifeplus.bean.api.SearchRequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.SearchResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.TagBean;
+import kr.co.zumo.app.lifeplus.bean.api.TagCheckBean;
 import kr.co.zumo.app.lifeplus.model.Model;
 import kr.co.zumo.app.lifeplus.model.module.APIError;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleSimpleListener;
@@ -39,7 +40,7 @@ public class SearchResultModel extends Model {
   protected Disposable disposableSearch;
   protected List<SearchContentsBean> resultContentsBeans;
   private String deliveredTag;
-  private String[] deliveredTags;
+  private String[] searchTags;
 
   private int hashCode = this.hashCode();
 
@@ -52,8 +53,9 @@ public class SearchResultModel extends Model {
   }
 
   private int listCount = 0;
-  private List<TagBean> tagBeans;
+  private List<TagCheckBean> tagCheckBeans;
   private List<CategoryBean> categoryBeans;
+  private List<TagBean> tagResultBeans;
 
   public SearchResultModel() {
     ContentsFlagHelper.getInstance().registerChangedObserver(hashCode);
@@ -100,9 +102,39 @@ public class SearchResultModel extends Model {
     }
   }
 
+  public void search(int index, boolean isChecked) {
+    Log.w("APP# SearchResultModel | search", "|" + " prev searchTags: " + Arrays.toString(searchTags));
+    Log.w("APP# SearchResultModel | search", "|" + " index: " + index + ", isChecked: " + isChecked);
+    TagCheckBean tagCheckBean = tagCheckBeans.get(index);
+    tagCheckBean.setChecked(isChecked);
+    StringBuilder builder = new StringBuilder();
+
+    int len = tagCheckBeans.size();
+    for (int i = 0; i < len; ++i) {
+      tagCheckBean = tagCheckBeans.get(i);
+
+      if (tagCheckBean.isChecked()) {
+        if (builder.length() > 0) {
+          builder.append(" ");
+        }
+        builder.append(tagCheckBean.getTagName());
+      }
+    }
+
+    setSearchTag(builder.toString());
+    search();
+  }
+
   public void search() {
     stopSearch();
-    disposableSearch = new APISearchModule().call(getSearchRequestBean(), new APIModuleSimpleListener<SearchResultBean>(waiterCaller) {
+    SearchRequestBean requestBean = new SearchRequestBean(getSearchTag());
+    Log.w("APP# SearchModel | search", "|" + " search ---> " + requestBean.toJson());
+    if (StringUtil.isEmpty(requestBean.getKeyword())) {
+      Log.i("APP# SearchResultModel | search", "|" + " 검색어 없음.");
+      waiterCaller.hideWaiter();
+      return;
+    }
+    disposableSearch = new APISearchModule().call(requestBean, new APIModuleSimpleListener<SearchResultBean>(waiterCaller) {
       @Override
       public void onApiSuccess(SearchResultBean resultBean) {
 
@@ -115,38 +147,55 @@ public class SearchResultModel extends Model {
         resultContentsBeans = resultBean.getData();
         listCount = resultBean.getListCount();
         categoryBeans = resultBean.getCategoryBeans();
-        tagBeans = resultBean.getTagBeans();
+        tagResultBeans = resultBean.getTagBeans();
 
-        if (null == tagBeans) {
-          tagBeans = new ArrayList<>();
+        if (null == tagResultBeans) {
+          tagResultBeans = new ArrayList<>();
         }
         if (null == categoryBeans) {
           categoryBeans = new ArrayList<>();
         }
 
-        if (tagBeans.size() > 0) {
-          Log.i("APP# SearchResultModel | onApiSuccess", "|" + "------------------- tagBeans.size(): " + tagBeans.size());
+        // 검색 된 태그 표시 -> 처음에만 설정 해줌.
+        if (null == tagCheckBeans) {
+          tagCheckBeans = new ArrayList<>();
+          int len = searchTags.length;
+          for (int i = 0; i < len; ++i) {
+            String tag = searchTags[i];
+            boolean isChecked = false;
+            for (TagBean tagBean : tagResultBeans) {
+              if (tag.equals(StringUtil.toTag(tagBean.getTagName()))) {
+                isChecked = true;
+                break;
+              }
+            }
+            tagCheckBeans.add(new TagCheckBean(tag, isChecked));
+          }
+        }
+
+        if (tagResultBeans.size() > 0) {
+          Log.i("APP# SearchResultModel | onApiSuccess", "|" + "------------------- tagBeans.size(): " + tagResultBeans.size());
           // 검색 결과 있음
-          if (deliveredTags.length == tagBeans.size()) {
+          if (searchTags.length == tagResultBeans.size()) {
             // tag 수 같음
             // -> count 추가
-            resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_COUNT, listCount, getResultTag()));
+            resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_COUNT, listCount, getResultTag(tagResultBeans)));
           }
           else {
             // tag 수 다름
             // -> tag no result 추가
             // -> count 추가
-            resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_COUNT, listCount, getResultTag()));
-            resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_NOTHING, deliveredTag));
+            resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_COUNT, listCount, getResultTag(tagResultBeans)));
+            resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_NOTHING, getSearchTag()));
           }
         }
         else {
-          Log.i("APP# SearchResultModel | onApiSuccess", "|" + "------------------- tagBeans: " + tagBeans);
+          Log.i("APP# SearchResultModel | onApiSuccess", "|" + "------------------- tagBeans: " + tagResultBeans);
           // 검색 결과 없음
           // -> no result 추가
           // -> 추천 콘텐트 추가
           resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_RECOMMEND));
-          resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_NOTHING_WITH_ICON, deliveredTag));
+          resultContentsBeans.add(0, new SearchContentsBean(SearchContentsBean.TYPE_NOTHING_WITH_ICON, getSearchTag()));
         }
 
         onResult(new Event.Builder(Event.SUCCESS).integer(Event.TAG_SEARCH).build());
@@ -159,7 +208,7 @@ public class SearchResultModel extends Model {
     });
   }
 
-  private String getResultTag() {
+  private String getResultTag(List<TagBean> tagBeans) {
     int len = tagBeans.size();
     StringBuilder tag = new StringBuilder();
     for (int i = 0; i < len; ++i) {
@@ -176,20 +225,24 @@ public class SearchResultModel extends Model {
     return resultContentsBeans;
   }
 
-  private SearchRequestBean getSearchRequestBean() {
-    // 공백 제거
-    String searchTag = TextUtils.join("", deliveredTags);
-    SearchRequestBean requestBean = new SearchRequestBean(searchTag);
-    Log.w("APP# SearchModel | search", "|" + " search ---> " + requestBean.toPrettyJson());
-    return requestBean;
+  private String getSearchTag() {
+    return TextUtils.join("", searchTags);
   }
 
-  public void setDeliveredTag(String tag) {
-    Log.w("APP# SearchResultModel | setDeliveredTag", "|" + "-----------> " + tag);
-    deliveredTags = tag.split(" ");
+  public void setDeliveredTag(String deliveredTag) {
+    this.deliveredTag = deliveredTag;
+  }
+
+  public String getDeliveredTag() {
+    return deliveredTag;
+  }
+
+  public void setSearchTag(String tag) {
+    Log.w("APP# SearchResultModel | setSearchTag", "|" + "-----------> " + tag);
+    searchTags = tag.split(" ");
 
     // 내용이 없는 태그는 제거
-    List<String> list = new ArrayList<>(Arrays.asList(deliveredTags));
+    List<String> list = new ArrayList<>(Arrays.asList(searchTags));
     int len = list.size();
     for (int i = len - 1; i >= 0; --i) {
       String s = list.get(i);
@@ -197,25 +250,28 @@ public class SearchResultModel extends Model {
         list.remove(i);
       }
     }
-    deliveredTags = list.toArray(new String[0]);
-    deliveredTag = TextUtils.join(" ", deliveredTags);
-    Log.w("APP# SearchResultModel | setDeliveredTag", "|" + " deliveredTags: " + Arrays.toString(deliveredTags));
-    Log.w("APP# SearchResultModel | setDeliveredTag", "|" + " deliveredTag: " + deliveredTag);
+    searchTags = list.toArray(new String[0]);
+    Log.w("APP# SearchResultModel | setSearchTag", "|" + " searchTags: " + Arrays.toString(searchTags));
+    Log.w("APP# SearchResultModel | setSearchTag", "|" + " searchTag: " + getSearchTag());
   }
 
   public int getListCount() {
     return listCount;
   }
 
-  public List<TagBean> getTagBeans() {
-    return tagBeans;
+  public List<TagCheckBean> getTagCheckBeans() {
+    return tagCheckBeans;
+  }
+
+  public List<TagBean> getTagResultBeans() {
+    return tagResultBeans;
   }
 
   public List<CategoryBean> getCategoryBeans() {
     return categoryBeans;
   }
 
-  public String[] getDeliveredTags() {
-    return deliveredTags;
+  public String[] getSearchTags() {
+    return searchTags;
   }
 }

+ 11 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultPresenter.java

@@ -38,9 +38,12 @@ public class SearchResultPresenter extends Presenter<SearchResultModel, ISearchR
   }
 
   private void render() {
+    if (doubleCheckerSearch.isCompleted() == false) {
+      // 처음에만 태그 그려줌
+      view.drawTags(model.getTagCheckBeans());
+    }
+    view.setVisibleCategory(model.getTagResultBeans().size() > 0);
     List<SearchContentsBean> list = model.getResultContentsBeans();
-    view.drawTags(model.getDeliveredTags(), model.getTagBeans());
-    view.setVisibleCategory(model.getTagBeans().size() > 0);
     view.drawResultContents(list);
   }
 
@@ -69,8 +72,8 @@ public class SearchResultPresenter extends Presenter<SearchResultModel, ISearchR
 
   @Override
   protected void startInternalOnce() {
+    model.setSearchTag(model.getDeliveredTag());
     model.search();
-
   }
 
   @Override
@@ -96,10 +99,11 @@ public class SearchResultPresenter extends Presenter<SearchResultModel, ISearchR
 
   @Override
   protected void onEventInternal(Event event) {
+    int index;
     switch (event.getEventId()) {
       case Event.CONTENTS:
         // item click
-        int index = event.getIndex();
+        index = event.getIndex();
         SearchContentsBean bean = model.getResultContentsBeans().get(index);
         ContentsDeliveryBean contentsDeliveryBean = new ContentsDeliveryBean.Builder(bean).build();
         model.setDeliveryPackaging(contentsDeliveryBean);
@@ -108,6 +112,9 @@ public class SearchResultPresenter extends Presenter<SearchResultModel, ISearchR
         break;
       case Event.TAG:
         // tag 선택
+        index = event.getIndex();
+        boolean isChecked = event.getBool();
+        model.search(index, isChecked);
         break;
       default:
         break;

+ 10 - 19
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultTagAdapter.java

@@ -12,8 +12,7 @@ import android.view.ViewGroup;
 import java.util.List;
 
 import kr.co.zumo.app.R;
-import kr.co.zumo.app.lifeplus.bean.api.TagBean;
-import kr.co.zumo.app.lifeplus.util.StringUtil;
+import kr.co.zumo.app.lifeplus.bean.api.TagCheckBean;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
 
 /**
@@ -28,13 +27,11 @@ import kr.co.zumo.app.lifeplus.view.IEventListener;
  */
 public class SearchResultTagAdapter extends RecyclerView.Adapter<SearchResultTagHolder> {
 
-  protected String[] deliveredTags;
-  protected List<TagBean> tagBeans;
+  protected List<TagCheckBean> tagCheckBeans;
   protected IEventListener listener;
 
-  public SearchResultTagAdapter(String[] tags, List<TagBean> tagBeans, IEventListener listener) {
-    this.deliveredTags = tags;
-    this.tagBeans = tagBeans;
+  public SearchResultTagAdapter(List<TagCheckBean> tagBeans, IEventListener listener) {
+    this.tagCheckBeans = tagBeans;
     this.listener = listener;
   }
 
@@ -48,26 +45,20 @@ public class SearchResultTagAdapter extends RecyclerView.Adapter<SearchResultTag
   @Override
   public void onBindViewHolder(@NonNull SearchResultTagHolder holder, int position) {
 
-    String tag = StringUtil.stripTag(deliveredTags[position]);
-    boolean isChecked = false;
-
-    for (TagBean tagBean : tagBeans) {
-      if (tag.equals(tagBean.getTagName())) {
-        isChecked = true;
-        break;
-      }
-    }
+    TagCheckBean bean = tagCheckBeans.get(position);
+    String tag = bean.getTagName();
+    boolean isChecked = bean.isChecked();
 
     holder.bind(tag, isChecked, listener);
   }
 
   @Override
   public int getItemCount() {
-    return deliveredTags.length;
+    return tagCheckBeans.size();
   }
 
-  public void update(List<TagBean> tagBeans) {
-    this.tagBeans = tagBeans;
+  public void update(List<TagCheckBean> tagBeans) {
+    this.tagCheckBeans = tagBeans;
     notifyDataSetChanged();
   }
 }