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?
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);
}
}
}