From d37202edae045f03f887cc49f98d6b2649519699 Mon Sep 17 00:00:00 2001 From: Alex <78383757+Lextical@users.noreply.github.com> Date: Tue, 7 Apr 2026 03:51:09 -0600 Subject: [PATCH] Updated Filterdropdown design for pets --- .../adapters/WhiteTextArrayAdapter.java | 47 ++++++++++++ .../fragments/listfragments/PetFragment.java | 8 +- .../petstoremobile/utils/SpinnerUtils.java | 28 ++++++- .../src/main/res/drawable/bg_search_bar.xml | 6 ++ .../app/src/main/res/drawable/bg_spinner.xml | 7 ++ .../app/src/main/res/layout/fragment_pet.xml | 73 +++++++++++++------ 6 files changed, 142 insertions(+), 27 deletions(-) create mode 100644 android/app/src/main/java/com/example/petstoremobile/adapters/WhiteTextArrayAdapter.java create mode 100644 android/app/src/main/res/drawable/bg_search_bar.xml create mode 100644 android/app/src/main/res/drawable/bg_spinner.xml diff --git a/android/app/src/main/java/com/example/petstoremobile/adapters/WhiteTextArrayAdapter.java b/android/app/src/main/java/com/example/petstoremobile/adapters/WhiteTextArrayAdapter.java new file mode 100644 index 00000000..42042207 --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/adapters/WhiteTextArrayAdapter.java @@ -0,0 +1,47 @@ +package com.example.petstoremobile.adapters; + +import android.content.Context; +import android.graphics.Color; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import com.example.petstoremobile.R; +import java.util.List; + +/** + * A class that overrides the arrayAdapter so the text color is white and background is transparent. + */ +public class WhiteTextArrayAdapter extends ArrayAdapter { + public WhiteTextArrayAdapter(@NonNull Context context, int resource, @NonNull T[] objects) { + super(context, resource, objects); + } + + public WhiteTextArrayAdapter(@NonNull Context context, int resource, @NonNull List objects) { + super(context, resource, objects); + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + View view = super.getView(position, convertView, parent); + view.setBackgroundColor(Color.TRANSPARENT); + if (view instanceof TextView) { + ((TextView) view).setTextColor(Color.WHITE); + } + return view; + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + View view = super.getDropDownView(position, convertView, parent); + view.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.primary_dark)); + if (view instanceof TextView) { + ((TextView) view).setTextColor(Color.WHITE); + } + return view; + } +} diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java index bf6e7e4e..bcb19fa8 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java @@ -19,8 +19,8 @@ import android.widget.AdapterView; import android.widget.Toast; import com.example.petstoremobile.R; -import com.example.petstoremobile.adapters.BlackTextArrayAdapter; import com.example.petstoremobile.adapters.PetAdapter; +import com.example.petstoremobile.adapters.WhiteTextArrayAdapter; import com.example.petstoremobile.databinding.FragmentPetBinding; import com.example.petstoremobile.dtos.PetDTO; import com.example.petstoremobile.dtos.StoreDTO; @@ -145,7 +145,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen */ private void setupStatusFilter() { String[] statuses = {"All Statuses", "Available", "Adopted"}; - BlackTextArrayAdapter adapter = new BlackTextArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item, statuses); + WhiteTextArrayAdapter adapter = new WhiteTextArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item, statuses); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); binding.spinnerStatus.setAdapter(adapter); @@ -163,7 +163,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen */ private void setupSpeciesFilter() { String[] species = {"All Species", "Dog", "Cat", "Bird", "Rabbit", "Fish", "Hamster"}; - BlackTextArrayAdapter adapter = new BlackTextArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item, species); + WhiteTextArrayAdapter adapter = new WhiteTextArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item, species); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); binding.spinnerSpecies.setAdapter(adapter); @@ -196,7 +196,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen storeViewModel.getAllStores(0, 100).observe(getViewLifecycleOwner(), resource -> { if (resource.status == Resource.Status.SUCCESS && resource.data != null) { storeList = resource.data.getContent(); - SpinnerUtils.populateSpinner(requireContext(), binding.spinnerStore, storeList, + SpinnerUtils.populateWhiteSpinner(requireContext(), binding.spinnerStore, storeList, StoreDTO::getStoreName, "All Stores", -1L, StoreDTO::getStoreId); } }); diff --git a/android/app/src/main/java/com/example/petstoremobile/utils/SpinnerUtils.java b/android/app/src/main/java/com/example/petstoremobile/utils/SpinnerUtils.java index fa22d21d..0041a0b2 100644 --- a/android/app/src/main/java/com/example/petstoremobile/utils/SpinnerUtils.java +++ b/android/app/src/main/java/com/example/petstoremobile/utils/SpinnerUtils.java @@ -5,6 +5,7 @@ import android.widget.ArrayAdapter; import android.widget.Spinner; import com.example.petstoremobile.adapters.BlackTextArrayAdapter; +import com.example.petstoremobile.adapters.WhiteTextArrayAdapter; import java.util.ArrayList; import java.util.List; @@ -22,6 +23,22 @@ public class SpinnerUtils { public static void populateSpinner(Context context, Spinner spinner, List data, Function nameExtractor, String defaultText, Long preselectedId, Function idExtractor) { + populateSpinnerWithAdapter(context, spinner, data, nameExtractor, defaultText, preselectedId, idExtractor, false); + } + + /** + * Populates a spinner with white text (for dark backgrounds). + */ + public static void populateWhiteSpinner(Context context, Spinner spinner, List data, + Function nameExtractor, String defaultText, + Long preselectedId, Function idExtractor) { + populateSpinnerWithAdapter(context, spinner, data, nameExtractor, defaultText, preselectedId, idExtractor, true); + } + + private static void populateSpinnerWithAdapter(Context context, Spinner spinner, List data, + Function nameExtractor, String defaultText, + Long preselectedId, Function idExtractor, + boolean useWhiteText) { List names = new ArrayList<>(); if (defaultText != null) { names.add(defaultText); @@ -31,8 +48,15 @@ public class SpinnerUtils { names.add(nameExtractor.apply(item)); } - spinner.setAdapter(new BlackTextArrayAdapter<>(context, - android.R.layout.simple_spinner_item, names)); + ArrayAdapter adapter; + if (useWhiteText) { + adapter = new WhiteTextArrayAdapter<>(context, android.R.layout.simple_spinner_item, names); + } else { + adapter = new BlackTextArrayAdapter<>(context, android.R.layout.simple_spinner_item, names); + } + + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(adapter); if (preselectedId != null && preselectedId != -1) { int offset = (defaultText != null) ? 1 : 0; diff --git a/android/app/src/main/res/drawable/bg_search_bar.xml b/android/app/src/main/res/drawable/bg_search_bar.xml new file mode 100644 index 00000000..342e4649 --- /dev/null +++ b/android/app/src/main/res/drawable/bg_search_bar.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/bg_spinner.xml b/android/app/src/main/res/drawable/bg_spinner.xml new file mode 100644 index 00000000..0fcab8e6 --- /dev/null +++ b/android/app/src/main/res/drawable/bg_spinner.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_pet.xml b/android/app/src/main/res/layout/fragment_pet.xml index 2e79ed1b..9273c0f0 100644 --- a/android/app/src/main/res/layout/fragment_pet.xml +++ b/android/app/src/main/res/layout/fragment_pet.xml @@ -54,50 +54,81 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="8dp" + android:paddingStart="12dp" + android:paddingEnd="12dp" + android:paddingTop="10dp" + android:paddingBottom="10dp" android:visibility="gone" - android:background="@color/white"> + android:background="@color/primary_dark" + android:elevation="4dp"> - + android:layout_height="44dp" + android:background="@drawable/bg_search_bar" + android:gravity="center_vertical" + android:paddingStart="12dp" + android:paddingEnd="12dp"> + + + + + + + android:orientation="horizontal" + android:layout_marginTop="8dp"> + android:background="@drawable/bg_spinner" + android:paddingStart="12dp" + android:paddingEnd="8dp"/> + + + android:background="@drawable/bg_spinner" + android:paddingStart="12dp" + android:paddingEnd="8dp"/> + android:layout_height="44dp" + android:layout_marginTop="8dp" + android:background="@drawable/bg_spinner" + android:paddingStart="12dp" + android:paddingEnd="8dp"/>