From ef4fa7ebeafb8458680acf3d08a97e30d3b3eae0 Mon Sep 17 00:00:00 2001 From: Nezumi <123229563+Nez27@users.noreply.github.com> Date: Tue, 14 Feb 2023 16:32:25 +0700 Subject: [PATCH] Add search view --- app/build.gradle | 6 +- .../foodify/Activity/MainActivity.java | 2 - .../foodify/Fragment/HomeFragment.java | 2 +- .../foodify/Fragment/SearchFragment.java | 83 +++++++++++++++++- .../com/capstone/foodify/IOnBackPressed.java | 5 ++ .../foodify/Model/Food/FoodAdapter.java | 7 ++ .../res/drawable/transparent_background.png | Bin 0 -> 8843 bytes app/src/main/res/layout/fragment_search.xml | 30 +++++-- app/src/main/res/layout/list_foods.xml | 27 +++--- 9 files changed, 135 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/capstone/foodify/IOnBackPressed.java create mode 100644 app/src/main/res/drawable/transparent_background.png diff --git a/app/build.gradle b/app/build.gradle index 20f7b22..7b41aec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,7 @@ android { dependencies { - implementation 'androidx.appcompat:appcompat:1.6.0' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' @@ -50,5 +50,7 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.14.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' - implementation 'com.squareup.picasso:picasso:2.8' + implementation 'com.squareup.picasso:picasso:2.71828' + + implementation "com.paulrybitskyi.persistentsearchview:persistentsearchview:1.1.4" } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java index 8bb7af6..dbe1f82 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java @@ -30,8 +30,6 @@ public class MainActivity extends AppCompatActivity { bottomNavigation(); } - - private void initComponent() { bottomNavigationView = findViewById(R.id.bottom_nav); viewPager2 = findViewById(R.id.viewPager); diff --git a/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java index 4ec093e..6a386ec 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java @@ -31,7 +31,7 @@ import retrofit2.Response; public class HomeFragment extends Fragment { - private static List listFood = new ArrayList<>(); + public static List listFood = new ArrayList<>(); private static List drinkFood = new ArrayList<>(); private ImageSlider imageSlider; 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 8b4bb29..a823474 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java @@ -1,20 +1,99 @@ package com.capstone.foodify.Fragment; +import static com.capstone.foodify.Fragment.HomeFragment.listFood; + +import android.app.Activity; import android.os.Bundle; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; +import com.capstone.foodify.Model.Food.FoodAdapter; import com.capstone.foodify.R; +import com.paulrybitskyi.persistentsearchview.PersistentSearchView; +import com.paulrybitskyi.persistentsearchview.listeners.OnSearchConfirmedListener; +import com.paulrybitskyi.persistentsearchview.utils.VoiceRecognitionDelegate; + +import java.util.Objects; public class SearchFragment extends Fragment { + + private RecyclerView recycler_view_search; + private FoodAdapter foodAdapter; + private PersistentSearchView persistentSearchView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_search, container, false); + View view = inflater.inflate(R.layout.fragment_search, container, false); + + //Init Component + recycler_view_search = view.findViewById(R.id.recycler_view_search); + persistentSearchView = view.findViewById(R.id.search_view); + + foodAdapter = new FoodAdapter(getContext()); + + GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 3); + recycler_view_search.setLayoutManager(gridLayoutManager); + + foodAdapter.setData(listFood); + recycler_view_search.setAdapter(foodAdapter); + + + persistentSearchView.setOnLeftBtnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(getContext(), "Left Btn", Toast.LENGTH_SHORT).show(); + } + }); + + persistentSearchView.setOnClearInputBtnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + // Handle the clear input button click + Toast.makeText(getContext(), "Clear Btn", Toast.LENGTH_SHORT).show(); + } + + }); + + // Setting a delegate for the voice recognition input + persistentSearchView.setVoiceRecognitionDelegate(new VoiceRecognitionDelegate(this)); + + persistentSearchView.setOnSearchConfirmedListener(new OnSearchConfirmedListener() { + + @Override + public void onSearchConfirmed(PersistentSearchView searchView, String query) { + // Handle a search confirmation. This is the place where you'd + // want to perform a search against your data provider. + Toast.makeText(getContext(), "setOnSearchConfirmedListener", Toast.LENGTH_SHORT).show(); + + searchView.collapse(); + } + + }); + + // Disabling the suggestions since they are unused in + // the simple implementation + persistentSearchView.setSuggestionsDisabled(false); + + return view; + } + + public static void hideKeyboard(Activity activity) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + //Find the currently focused view, so we can grab the correct window token from it. + View view = activity.getCurrentFocus(); + //If no view currently has focus, create a new one, just so we can grab a window token from it + if (view == null) { + view = new View(activity); + } + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/IOnBackPressed.java b/app/src/main/java/com/capstone/foodify/IOnBackPressed.java new file mode 100644 index 0000000..08a1fa3 --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/IOnBackPressed.java @@ -0,0 +1,5 @@ +package com.capstone.foodify; + +public interface IOnBackPressed { + boolean onBackPressed(); +} diff --git a/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java b/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java index f629592..ffff9b7 100644 --- a/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java +++ b/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java @@ -1,5 +1,6 @@ package com.capstone.foodify.Model.Food; +import android.content.Context; import android.text.Layout; import android.view.LayoutInflater; import android.view.View; @@ -18,7 +19,13 @@ import java.util.List; public class FoodAdapter extends RecyclerView.Adapter{ private List listFood; + private Context context; + public FoodAdapter(Context context){ + this.context = context; + } + + public FoodAdapter() {} public void setData(List list) { this.listFood = list; notifyDataSetChanged(); diff --git a/app/src/main/res/drawable/transparent_background.png b/app/src/main/res/drawable/transparent_background.png new file mode 100644 index 0000000000000000000000000000000000000000..e049556292ef108fbe9719d7d0a56e4581d6c35e GIT binary patch literal 8843 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index b040598..ab0109d 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -1,14 +1,30 @@ - + tools:context=".Fragment.SearchFragment" + xmlns:app="http://schemas.android.com/apk/res-auto" + > - - + android:layout_height="wrap_content" /> - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_foods.xml b/app/src/main/res/layout/list_foods.xml index bc59d6e..4bde8c5 100644 --- a/app/src/main/res/layout/list_foods.xml +++ b/app/src/main/res/layout/list_foods.xml @@ -1,7 +1,7 @@ @@ -20,8 +20,8 @@ @@ -61,7 +62,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:layout_marginTop="10dp" + android:layout_marginTop="5dp" android:layout_marginStart="2dp" app:layout_constraintTop_toBottomOf="@id/title" app:layout_constraintStart_toStartOf="parent" @@ -69,7 +70,7 @@