am trying to use a spinner within a fragment to categorize the output of my recycler view
when I call the recycler view function from the onCreateView it works perfectly. however, when I call it from the spinner function, it requires 2 clicks to display.
here is the spinner XML code:
<Spinner android:id="@+id/med_spinner" android:layout_width="150dp" android:layout_height="30dp" android:layout_below="@+id/tv_med2" android:layout_marginLeft="15dp" android:layout_marginTop="20dp" android:layout_toRightOf="@id/tv_spinner" android:dropDownWidth="match_parent" android:focusable="true" android:gravity="center" android:entries="@array/medicine" />
and here is the fragment:
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.frag_medicine, container, false); RecyclerView rv_med = view.findViewById(R.id.rv_medicine); db = new UserDB(getActivity()); med_name = new ArrayList<>(); med_type = new ArrayList<>(); med_type2 = new ArrayList<>(); //spinner declartion spinner = view.findViewById(R.id.med_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.medicine, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(this); //recycler view adapter and layout manger recyclerViewAdapter = new RecyclerViewAdapterMedicine(getContext(), med_name, med_type, med_type2); rv_med.setAdapter(recyclerViewAdapter); rv_med.setLayoutManager(new LinearLayoutManager(getContext())); return view; }
and here is the spinner functions
@Override public void onItemSelected(AdapterView<?> parent, View view, int i, long l) { med_name.clear(); med_type.clear(); med_type2.clear(); cata = spinner.getSelectedItem().toString(); display(cata); } @Override public void onNothingSelected(AdapterView<?> parent) { cata = "All"; display(cata); }
here’s the display function:
void display(String type) { db.open(); Cursor cursor = db.listMedicine(); if (cursor.getCount() == 0) { Toast.makeText(getActivity(), "an error occurred", Toast.LENGTH_LONG).show(); } else { if (type.equals("All")){ while (cursor.moveToNext()) { med_name.add(cursor.getString(1)); med_type.add(cursor.getString(2)); med_type2.add(cursor.getString(3)); } }else{ while (cursor.moveToNext()) { if(cursor.getString(2).equals(type) || cursor.getString(3).equals(type)) { med_name.add(cursor.getString(1)); med_type.add(cursor.getString(2)); med_type2.add(cursor.getString(3)); } } } db.close(); } }
I’ve tried to put the spinner functions within a spinner.onItemSelectedListener inside and outside the fragment, I tried to enable and disable focus and focusableTochMode, I also tried to call the recycler view before the spinner in the fragment.
Advertisement
Answer
You need to notify your RecyclerViewAdapter
that data has changed. Add
recyclerViewAdapter.notifyDataSetChanged()
at the end of your display
.