Updated Filterdropdown design for pets

This commit is contained in:
Alex
2026-04-07 03:51:09 -06:00
parent 0086bb4a5e
commit d37202edae
6 changed files with 142 additions and 27 deletions

View File

@@ -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<T> extends ArrayAdapter<T> {
public WhiteTextArrayAdapter(@NonNull Context context, int resource, @NonNull T[] objects) {
super(context, resource, objects);
}
public WhiteTextArrayAdapter(@NonNull Context context, int resource, @NonNull List<T> 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;
}
}

View File

@@ -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<String> adapter = new BlackTextArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item, statuses);
WhiteTextArrayAdapter<String> 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<String> adapter = new BlackTextArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item, species);
WhiteTextArrayAdapter<String> 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);
}
});

View File

@@ -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 <T> void populateSpinner(Context context, Spinner spinner, List<T> data,
Function<T, String> nameExtractor, String defaultText,
Long preselectedId, Function<T, Long> idExtractor) {
populateSpinnerWithAdapter(context, spinner, data, nameExtractor, defaultText, preselectedId, idExtractor, false);
}
/**
* Populates a spinner with white text (for dark backgrounds).
*/
public static <T> void populateWhiteSpinner(Context context, Spinner spinner, List<T> data,
Function<T, String> nameExtractor, String defaultText,
Long preselectedId, Function<T, Long> idExtractor) {
populateSpinnerWithAdapter(context, spinner, data, nameExtractor, defaultText, preselectedId, idExtractor, true);
}
private static <T> void populateSpinnerWithAdapter(Context context, Spinner spinner, List<T> data,
Function<T, String> nameExtractor, String defaultText,
Long preselectedId, Function<T, Long> idExtractor,
boolean useWhiteText) {
List<String> 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<String> 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;

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white"/>
<corners android:radius="22dp"/>
</shape>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#1AFFFFFF"/>
<stroke android:width="1dp" android:color="#33FFFFFF"/>
<corners android:radius="8dp"/>
</shape>

View File

@@ -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">
<EditText
android:id="@+id/etSearchPet"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:hint="Search..."
android:inputType="text"
android:drawableStart="@android:drawable/ic_menu_search"
android:drawablePadding="8dp"
android:background="@android:color/transparent"
android:padding="12dp"
android:textColor="@color/text_dark"/>
android:layout_height="44dp"
android:background="@drawable/bg_search_bar"
android:gravity="center_vertical"
android:paddingStart="12dp"
android:paddingEnd="12dp">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:src="@android:drawable/ic_menu_search"
android:alpha="0.6"/>
<EditText
android:id="@+id/etSearchPet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="Search pets..."
android:inputType="text"
android:background="@android:color/transparent"
android:textColor="@color/text_dark"
android:textColorHint="#99000000"
android:textSize="14sp"
android:paddingStart="8dp"
android:paddingEnd="8dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:orientation="horizontal"
android:layout_marginTop="8dp">
<Spinner
android:id="@+id/spinnerStatus"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_height="44dp"
android:layout_weight="1"
android:background="@android:color/transparent"/>
android:background="@drawable/bg_spinner"
android:paddingStart="12dp"
android:paddingEnd="8dp"/>
<View
android:layout_width="8dp"
android:layout_height="0dp"/>
<Spinner
android:id="@+id/spinnerSpecies"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_height="44dp"
android:layout_weight="1"
android:layout_marginStart="4dp"
android:background="@android:color/transparent"/>
android:background="@drawable/bg_spinner"
android:paddingStart="12dp"
android:paddingEnd="8dp"/>
</LinearLayout>
<Spinner
android:id="@+id/spinnerStore"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginTop="4dp"
android:background="@android:color/transparent"/>
android:layout_height="44dp"
android:layout_marginTop="8dp"
android:background="@drawable/bg_spinner"
android:paddingStart="12dp"
android:paddingEnd="8dp"/>
</LinearLayout>