Disabling dynamically a spinner item in Android

1.6k Views Asked by At

For our project, I need to implement the following: a spinner item is disabled when the same item is selected in another spinner (and vice-versa). Any ideas of how to approach it, or also if there exist already such implementation (maybe within the adapter or Spinner class)?

1

There are 1 best solutions below

1
codeocity On

I understand that both spinners have the same items list,so you can set the first and get the position and automatically disable that position in the second spinner .

public class MainActivity extends AppCompatActivity {
int selectedItemSpinner1;

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


    // Items in the two Spinners
    String[] languages = new String[]{
            "English",
            "French",
            "German",
            "Spanish",
            "Italien"
    };
    List<String> languagesList = new ArrayList<>(Arrays.asList(languages));


    // Set the spinner 1 and get the selected value position
    Spinner spinner1 =  findViewById(R.id.spinner1);
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this,R.layout.support_simple_spinner_dropdown_item,languagesList);
    spinner1.setAdapter(adapter);

    spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedItemSpinner1 = position;
        }

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


    // Set the spinner 2 and disable the position
    Spinner spinner2 =  findViewById(R.id.spinner2);
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this,R.layout.spinner_item,languagesList){
        @Override
        public boolean isEnabled(int position){
            if(position == selectedItemSpinner1)
            { return false;
            }
            else
            {
                return true;
            }
        }

        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            View view = super.getDropDownView(position, convertView, parent);
            TextView tv = (TextView) view;

            if(position==selectedItemSpinner1) {
                // Set the disable item text color
                tv.setTextColor(Color.GRAY);
            }
            else {
                tv.setTextColor(Color.BLACK);
            }
            return view;
        }
    };
    spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
    spinner2.setAdapter(spinnerArrayAdapter);
}