浏览代码

[검색][New] 동일 검색어-> 카테고리 선택 시 캐시 적용

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

+ 4 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/SearchRequestBean.java

@@ -33,13 +33,13 @@ public class SearchRequestBean extends KeywordRequestBean {
   public static final String ORDER_BY_BOOKMARK = "3";
 
   @SerializedName("ctgrNo")
-  private String categoryNumber;
+  private String categoryNumber = "";
   @SerializedName("fltrTxt")    // "fltrTxt":"#1#2#2#2", -- 일반필터조건 ,필터코드(#filterNo)
-  private String filter;
+  private String filter = "";
   @SerializedName("fltrAreaTxt")  // "fltrAreaTxt":"#서울", -- 필터 지역 조건 ,지역명(#tagName)
-  private String filterArea;
+  private String filterArea = "";
   @SerializedName("fltrHotPlaceTxt")  // "fltrHotPlaceTxt":"#누각", -- 필터 핫플레이스 조건 ,핫플레이명(#tagName)
-  private String filterPlace;
+  private String filterPlace = "";
   @SerializedName("orderby")
   private String order;
 

+ 90 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/model/module/APISearchModule.java

@@ -3,9 +3,19 @@
  */
 package kr.co.zumo.app.lifeplus.model.module;
 
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
 import io.reactivex.Single;
+import io.reactivex.functions.Consumer;
+import kr.co.zumo.app.lifeplus.bean.api.CategoryBean;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
+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.network.api.LifeplusAPIRepository;
 
 /**
@@ -19,8 +29,87 @@ import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIRepository;
  * @since 2019. 1. 11.
  */
 public class APISearchModule extends LifeplusAPIModule<SearchRequestBean, SearchResultBean> {
+
+  private static List<SearchContentsBean> searchContentsBeans;
+  private static List<TagBean> tagBeans;
+  private static List<CategoryBean> categoryBeans;
+  private static String keyword;
+
   @Override
   protected Single<SearchResultBean> getAPI(SearchRequestBean requestBean) {
-    return new LifeplusAPIRepository().search(requestBean);
+    String categoryNo = requestBean.getCategoryNumber();
+    String filters = requestBean.getFilter() + requestBean.getFilterArea() + requestBean.getFilterPlace();
+    if ("".equals(filters) && null != searchContentsBeans) {
+      // 필터가 없을 때만 적용
+      List<SearchContentsBean> list = new ArrayList<>();
+      if ("".equals(categoryNo)) {
+        if (requestBean.getKeyword().equals(keyword)) {
+          // 같은 키워드 ('전체') 선택 시
+          list.addAll(searchContentsBeans);
+        }
+      }
+      else {
+        // 카테고리를 구분할 때 저장된 데이터 중 골라 줌.
+        int len = searchContentsBeans.size();
+        SearchContentsBean bean;
+        for (int i = 0; i < len; ++i) {
+          bean = searchContentsBeans.get(i);
+          if (categoryNo.equals(bean.getCategoryNo())) {
+            list.add(bean);
+          }
+        }
+      }
+
+      if (list.size() > 0) {
+        Log.w("APP# APISearchModule | getAPI", "|" + " ************** cache return ***************");
+        return Single.fromCallable(() -> {
+          List<TagBean> tags = new ArrayList<>(tagBeans);
+          List<CategoryBean> categorys = new ArrayList<>(categoryBeans);
+          SearchResultBean searchResultBean = new SearchResultBean();
+          searchResultBean.setCode(LifeplusAPIBean.RETURN_SUCCESS);
+          searchResultBean.setTagBeans(tags);
+          searchResultBean.setCategoryBeans(categorys);
+          searchResultBean.setData(list);
+          searchResultBean.setListCount(list.size());
+          return searchResultBean;
+        });
+      }
+    }
+
+    return new LifeplusAPIRepository().search(requestBean).doOnSuccess(new Consumer<SearchResultBean>() {
+      @Override
+      public void accept(SearchResultBean searchResultBean) throws Exception {
+        if ("".equals(filters)) {
+          // 필터가 없을 때만 적용
+          if ("".equals(categoryNo)) {
+            // 필터 없는 데이터
+            // 로드한 전체 데이터 저장
+            keyword = requestBean.getKeyword();
+            searchContentsBeans = new ArrayList<>();
+            if (null != searchResultBean.getData()) {
+              searchContentsBeans.addAll(searchResultBean.getData());
+            }
+            tagBeans = new ArrayList<>();
+            if (null != searchResultBean.getTagBeans()) {
+              tagBeans.addAll(searchResultBean.getTagBeans());
+            }
+            categoryBeans = new ArrayList<>();
+            if (null != searchResultBean.getCategoryBeans()) {
+              categoryBeans.addAll(searchResultBean.getCategoryBeans());
+            }
+          }
+        }
+      }
+    });
+  }
+
+  /**
+   * clear cache
+   */
+  public static void clearCache() {
+    searchContentsBeans = null;
+    tagBeans = null;
+    keyword = null;
+    categoryBeans = null;
   }
 }

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

@@ -24,6 +24,7 @@ import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.model.module.APIError;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleSimpleListener;
 import kr.co.zumo.app.lifeplus.model.module.APISearchAutoCompletionModule;
+import kr.co.zumo.app.lifeplus.model.module.APISearchModule;
 import kr.co.zumo.app.lifeplus.model.module.APISearchPopularTagModule;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
@@ -57,7 +58,7 @@ public class SearchModel extends Model {
 
   @Override
   protected void destroyInternal() {
-
+    APISearchModule.clearCache();
   }
 
   @Override