Android - How to Disable Specific Item for Multiple Spinner in One Activity

875 views Asked by At

I have three spinners in one activity. How to disable an item selected from each spinners to the respective spinner?

I have set the data in string array in strings.xml:

<string-array name="preferences">
    <item>American Restaurant</item>
    <item>Arabian Restaurant</item>
    <item>Asian Restaurant</item>
    <item>Chinese Restaurant</item>
    <item>Filipino Restaurant</item>
    <item>Indonesian Restaurant</item>
    <item>Sushi Restaurant</item>
</string-array>

I declared the ArrayAdapter as below:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.preferences, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

This is my spinner declaration:

spinnerMainPref = findViewById(R.id.main_preference_spinner);
spinnerMainPref.setAdapter(adapter);
spinnerMainPref.setOnItemSelectedListener(this);

spinnerPref2 = findViewById(R.id.preference2_spinner);
spinnerPref2.setAdapter(adapter);
spinnerPref2.setOnItemSelectedListener(this);

spinnerPref3 = findViewById(R.id.preference3_spinner);
spinnerPref3.setAdapter(adapter);
spinnerPref3.setOnItemSelectedListener(this);

I tried to manipulate the spinners in onItemSelected :

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

    switch (adapterView.getId()) {
        case R.id.main_preference_spinner:
            String valueMainPref = adapterView.getItemAtPosition(i).toString();
            editor.putString("mainPreference", valueMainPref);
            editor.putInt("mainPreferenceValuePosition", i);
            editor.apply();
            break;

        case R.id.preference2_spinner:
            String valuePref2 = adapterView.getItemAtPosition(i).toString();
            editor.putString("secondPreference", valuePref2);
            editor.putInt("secondPreferenceValuePosition", i);
            editor.apply();
            break;

        case R.id.preference3_spinner:
            String valuePref3 = adapterView.getItemAtPosition(i).toString();
            editor.putString("thirdPreference", valuePref3);
            editor.putInt("thirdPreferenceValuePosition", i);
            editor.apply();
            break;
    }
}

For example, if user select specific item in spinner one, I want to make that item disable for spinner 2 and spinner 3. Same goes when user select specific item in spinner 2, I want to make that item disable for spinner 1 and spinner 3. I hope you understand my question :)

2

There are 2 answers

0
Peter Chaula On

You need to override ArrayAdapter.getView()

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.preferences, android.R.layout.simple_spinner_item){
   public View getView(int pos, View convertView, ViewGroup parent) {
       //your logic to disable items
   } 
}
0
Reaz Murshed On

I think you can have a custom spinner adapter like the following.

public class MySpinnerAdapter extends BaseAdapter {


    @Override
    public void isEnabled(int position) {
       return getItem(position).isEnabled(); 
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

      if(convertView == null) {
          convertView = View.inflate(parent.getContext(), R.layout.item, null);
      }

      if(!isEnabled(position)) {
          convertView.setEnabled(false);
          convertView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                //NO-OP: Just intercept click on disabled item
             }
          });
      }

      return convertView;
    }
}

Assign the adapter to each of your spinners. Then call the isEnabled(false) to the other spinners when one is selected. Anyway, you have to keep the track of this statuses and make sure that when the first one gets unselected, it sets the others in the enabled state again.

I hope that helps.