1

I have pondered on this for days now, I need help. I have 2 fragments in a viewpager. They are both showing the same values despite feeding them with different data.

Link to image Fragment A has a spinner dropdown of countries same as Fragment B. Fragment A is supposed to show list of Hospitals when country is selected, Fragment B is supposed to show list of Schools depending on country selected.

PROBLEM When I select a country in Fragment A, I get the list of hospitals in fragment A. When I swipe to fragment B, I find the list of hospitals which are supposed to be in A displayed. When I select a country in B, the list refreshes and I get the list of schools as should be, but when I swipe back again to fragment A I find the same list of schools instead of list of hospitals previously selected. I am using dagger2 with databinding.

Below code depicts one scenario but they are basically the same just different adapters and also different layouts.

CODE

private void initRecyclerview() {
    binding.rvSchools.setHasFixedSize(true);
    adapter = new SchoolsAdapter(getContext());
    binding.rvSchools.setLayoutManager(new LinearLayoutManager(getContext()));
    binding.rvSchools.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

private void countries() {
    viewModel.getCountries().removeObservers(getViewLifecycleOwner());
    viewModel.getCountries().observe(getViewLifecycleOwner(), new Observer<Resource<List<Countries>>>() {
        @Override
        public void onChanged(Resource<List<Countries>> countriesList) {
                switch (countriesList.status) {
                    case SUCCESS: 
                        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(getApplicationContext,
                                R.layout.simple_spinner_item, countriesList);
                        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        binding.spinner.setAdapter(spinnerAdapter);
                        spinnerAdapter.notifyDataSetChanged();
                        break;
            }
        }
    });

    binding.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String country = countriesList.get(position);

            schools(country);

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {}
    });
}

private void schools(String country) {
    viewModel.getSchoolsHospitals(country, "School").removeObservers(getViewLifecycleOwner());
   viewModel.getSchoolsHospitals(country, "School").observe(getViewLifecycleOwner(), new Observer<Resource<List<SchoolsHospitals>>>() {
        @Override
        public void onChanged(Resource<List<SchoolsHospitals>> schoolsList) {
                switch (schoolsList.status) {
                    case SUCCESS: 
                        binding.setSchools(schoolsList.data);
            }
        }
    });
}
Jenny
  • 11
  • 5

1 Answers1

0

This is a rather odd behaviour considering how I wanted to re-use code. I was using the same viewModel class because the data is the same. After creating a separate viewModel class for Schools i.e a duplicate ViewModel just different class names, the respective contents were set as needed.

If there is a better approach, it will be much appreciated.

Jenny
  • 11
  • 5