From 5bd3f596a6318d4778834d30ffdb7329ca48e27c Mon Sep 17 00:00:00 2001 From: Nezumi <123229563+Nez27@users.noreply.github.com> Date: Fri, 17 Feb 2023 13:32:41 +0700 Subject: [PATCH] Add Category tag to Search Fragment --- .../com/capstone/foodify/API/FoodApi.java | 8 ++ .../foodify/Fragment/SearchFragment.java | 95 +++++++++++++++---- .../foodify/Model/Category/Category.java | 22 +++++ app/src/main/res/layout/chip_item.xml | 9 ++ app/src/main/res/layout/fragment_search.xml | 10 +- 5 files changed, 127 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/capstone/foodify/Model/Category/Category.java create mode 100644 app/src/main/res/layout/chip_item.xml diff --git a/app/src/main/java/com/capstone/foodify/API/FoodApi.java b/app/src/main/java/com/capstone/foodify/API/FoodApi.java index ac14c77..0079eee 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApi.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApi.java @@ -1,5 +1,6 @@ package com.capstone.foodify.API; +import com.capstone.foodify.Model.Category.Category; import com.capstone.foodify.Model.Food.Food; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -10,6 +11,7 @@ import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.http.GET; +import retrofit2.http.Path; import retrofit2.http.Query; @@ -30,4 +32,10 @@ public interface FoodApi { @GET("listFood") Call> listFood(@Query("search") String search); + + @GET("Category") + Call> listCategory(); + + @GET("Category/{id}/food") + Call> listFoodByCategory(@Path("id") String id); } diff --git a/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java index 8db61e4..7472d7f 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java @@ -8,6 +8,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; +import android.widget.CompoundButton; import android.widget.Toast; import androidx.fragment.app.Fragment; @@ -15,10 +16,13 @@ import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.capstone.foodify.API.FoodApi; +import com.capstone.foodify.Model.Category.Category; import com.capstone.foodify.Model.Food.Food; import com.capstone.foodify.Model.Food.FoodAdapter; import com.capstone.foodify.Model.Food.FoodSearchAdapter; import com.capstone.foodify.R; +import com.google.android.material.chip.Chip; +import com.google.android.material.chip.ChipGroup; import com.paulrybitskyi.persistentsearchview.PersistentSearchView; import com.paulrybitskyi.persistentsearchview.listeners.OnSearchConfirmedListener; import com.paulrybitskyi.persistentsearchview.listeners.OnSearchQueryChangeListener; @@ -35,9 +39,9 @@ public class SearchFragment extends Fragment { private RecyclerView recycler_view_search; private FoodSearchAdapter foodAdapter; - private PersistentSearchView persistentSearchView; - - private static List listFoodSearch = new ArrayList<>(); + private static final List listFoodSearch = new ArrayList<>(); + private ChipGroup list_Category; + private final List statusCategoryChecked = new ArrayList<>(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -45,11 +49,14 @@ public class SearchFragment extends Fragment { View view = inflater.inflate(R.layout.fragment_search, container, false); //Init Component + PersistentSearchView persistentSearchView = view.findViewById(R.id.search_view); recycler_view_search = view.findViewById(R.id.recycler_view_search); - persistentSearchView = view.findViewById(R.id.search_view); + list_Category = view.findViewById(R.id.list_category); foodAdapter = new FoodSearchAdapter(getContext()); + getListCategory(); + GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 3); recycler_view_search.setLayoutManager(gridLayoutManager); @@ -57,7 +64,6 @@ public class SearchFragment extends Fragment { recycler_view_search.setAdapter(foodAdapter); persistentSearchView.setLeftButtonDrawable(R.drawable.ic_search); - persistentSearchView.setOnSearchConfirmedListener(new OnSearchConfirmedListener() { @Override @@ -68,17 +74,7 @@ public class SearchFragment extends Fragment { FoodApi.apiService.listFood(query).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { - List foodData = response.body(); - - if(foodData != null) { - listFoodSearch.clear(); - for(Food tempFood: foodData){ - listFoodSearch.add(tempFood); - } - foodAdapter.setData(listFoodSearch); - recycler_view_search.setAdapter(foodAdapter); - } - + loadFoodAdapter(response); } @Override @@ -86,6 +82,8 @@ public class SearchFragment extends Fragment { Toast.makeText(getContext(), "Lỗi" + t, Toast.LENGTH_LONG).show(); } }); + + Toast.makeText(getContext(), "Category checked: " + statusCategoryChecked.toString(), Toast.LENGTH_SHORT).show(); } searchView.collapse(); @@ -106,4 +104,69 @@ public class SearchFragment extends Fragment { return view; } + private void loadFoodAdapter(Response> response) { + List foodData = response.body(); + + if(foodData != null) { + listFoodSearch.clear(); + listFoodSearch.addAll(foodData); + foodAdapter.setData(listFoodSearch); + recycler_view_search.setAdapter(foodAdapter); + } + } + + private void getListCategory() { + LayoutInflater inflater = LayoutInflater.from(getContext()); + + FoodApi.apiService.listCategory().enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + List categoriesData = response.body(); + + if(categoriesData != null){ + for(Category tempCategory: categoriesData){ + Chip chip = (Chip) inflater.inflate(R.layout.chip_item, null, false); + chip.setText(tempCategory.getName()); + chip.setEnabled(true); + + chip.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + loadFoodByCategory(tempCategory.getId()); + if(b) { + statusCategoryChecked.add(tempCategory.getId()); + } else { + statusCategoryChecked.remove(tempCategory.getId()); + } + } + }); + + list_Category.addView(chip); + } + } + + } + + @Override + public void onFailure(Call> call, Throwable t) { + Toast.makeText(getContext(), "Error: " + t , Toast.LENGTH_SHORT).show(); + } + }); + } + + private void loadFoodByCategory(String id) { + + FoodApi.apiService.listFoodByCategory(id).enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + loadFoodAdapter(response); + } + + @Override + public void onFailure(Call> call, Throwable t) { + Toast.makeText(getContext(), "Error: " + t, Toast.LENGTH_SHORT).show(); + } + }); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/Model/Category/Category.java b/app/src/main/java/com/capstone/foodify/Model/Category/Category.java new file mode 100644 index 0000000..984dfaa --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/Model/Category/Category.java @@ -0,0 +1,22 @@ +package com.capstone.foodify.Model.Category; + +public class Category { + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/app/src/main/res/layout/chip_item.xml b/app/src/main/res/layout/chip_item.xml new file mode 100644 index 0000000..0c80015 --- /dev/null +++ b/app/src/main/res/layout/chip_item.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 644c018..824b2d7 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -19,13 +19,21 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + +