Search code examples
javaandroidfragmentspinner

Multiple spinners and conditions inside a fragment in android, java


I'm trying to create app which has 3 fragments (pages). Inside each fragment I have several spinners (options to chose). User can chose different options and depending on combination of these options, he will see the price.

I use following code in Main Activity

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;

import com.example.myapplication.fragments.PageFragment1;
import com.example.myapplication.fragments.PageFragment2;
import com.example.myapplication.fragments.PageFragment3;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {


    private ViewPager pager;
    private PagerAdapter pagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<Fragment> list = new ArrayList<>();
        list.add(new PageFragment1());
        list.add(new PageFragment2());
        list.add(new PageFragment3());

        pager = findViewById(R.id.pager);
        pagerAdapter = new SlidePageAdapter(getSupportFragmentManager(),list);

        pager.setAdapter(pagerAdapter);

    }
}

and following code in PageAdapter

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

import java.util.List;

public class SlidePageAdapter extends FragmentStatePagerAdapter {

private List<Fragment> fragmentList;

public SlidePageAdapter(FragmentManager fm, List<Fragment> fragmentList) {
    super(fm);
this.fragmentList = fragmentList;
}



    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

and in PageFragment1

package com.example.myapplication.fragments;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.PagerAdapter;

import com.example.myapplication.R;
import com.google.android.material.navigation.NavigationBarView;


public class PageFragment1 extends Fragment {

   

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater
                .inflate(R.layout.page_1, container
                        , false);


        Spinner spinner1 = (Spinner) rootView.findViewById(R.id.spinnerMarket);
        ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.Market, android.R.layout.simple_spinner_item);
        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(adapter1);

        Spinner spinner2 = (Spinner) rootView.findViewById(R.id.spinnerEmission);
        ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(getActivity(), R.array.Emissions, android.R.layout.simple_spinner_item);
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner2.setAdapter(adapter2);

        Spinner spinner3 = (Spinner) rootView.findViewById(R.id.spinnerAxles);
        ArrayAdapter<CharSequence> adapter3 = ArrayAdapter.createFromResource(getActivity(), R.array.Axles, android.R.layout.simple_spinner_item);
        adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner3.setAdapter(adapter3);

        Spinner spinner4 = (Spinner) rootView.findViewById(R.id.spinnerGearbox);
        ArrayAdapter<CharSequence> adapter4 = ArrayAdapter.createFromResource(getActivity(), R.array.Gearbox, android.R.layout.simple_spinner_item);
        adapter4.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner4.setAdapter(adapter4);

        Spinner spinner5 = (Spinner) rootView.findViewById(R.id.spinnerFrontSuspension);
        ArrayAdapter<CharSequence> adapter5 = ArrayAdapter.createFromResource(getActivity(), R.array.FrontSuspension, android.R.layout.simple_spinner_item);
        adapter5.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner5.setAdapter(adapter5);

        Spinner spinner6 = (Spinner) rootView.findViewById(R.id.spinnerRearSuspension);
        ArrayAdapter<CharSequence> adapter6 = ArrayAdapter.createFromResource(getActivity(), R.array.RearSuspension, android.R.layout.simple_spinner_item);
        adapter6.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner6.setAdapter(adapter6);

        Spinner spinner7 = (Spinner) rootView.findViewById(R.id.spinnerTrailAxle);
        ArrayAdapter<CharSequence> adapter7 = ArrayAdapter.createFromResource(getActivity(), R.array.TrailAxle, android.R.layout.simple_spinner_item);
        adapter7.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner7.setAdapter(adapter7);



     spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {

            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view,
                                       int position, long id) {

 //Some conditions for all spinners//

            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });



        return rootView;
    }

}

The problem is that I have 7 spinners and conditions for price calculation are the same. So I have to put the same code for each spinner, so the program will adjust the price each time user chose different option. Looks a bit odd to me, because the program is getting huge. And I have two more fragments with the same structure. I was trying to put something like below instead of a code for each spinner

@Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

//conditions//

}

But it doesn't work in fragment. I'm absolutely new in coding, so could you please give me detailed suggestion?


Solution

  • You could condense the logic by reusing the view initialization logic and the listener. First, create a separate listener class:

    class CustomSpinnerItemSelectedListener implements AdapterView.OnItemSelectedListener {
    
       @Override
       public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
          // You can customize the logic per spinner using either the view or the id
       }
    
       @Override
       public void onNothingSelected(AdapterView<?> parent) {
    
       }
    }
    

    Then inside your fragment, save your view ids in an array, iterate over the array and execute the same view initialization logic like this:

    public class PageFragment1 extends Fragment {
    
       private static int[] VIEW_IDS = {
               R.id.spinnerMarket,
               R.id.spinnerEmission,
               ...
       };
    
       @Nullable
       @Override
       public View onCreateView(LayoutInflater inflater,
                                 @Nullable ViewGroup container,
                                 @Nullable Bundle savedInstanceState) {
           ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.page_1, container, false);
        
           CustomSpinnerItemSelectedListener listener = new CustomSpinnerItemSelectedListener();
          for (int id: VIEW_IDS) {
             Spinner spinner = (Spinner) rootView.findViewById(id);
             ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.Market, android.R.layout.simple_spinner_item);
             adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
             spinner.setAdapter(adapter);
             spinner.setOnItemSelectedListener(listener);
          }
    
       }
    }