Ecco il codice, congegnato in modo che la somma dei valori dei numeri elencati nei due Spinner non sia superiore a 4:
public class MainActivity extends Activity { Spinner spinnerHr; Spinner spinnerMin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinnerHr=(Spinner)findViewById(R.id.spinner1); spinnerMin=(Spinner)findViewById(R.id.spinner2); final List<Integer> arrListHr=new ArrayList<Integer>(Arrays.asList(1,2,3,4,5)); final ArrayAdapter<Integer> adapterHr=new ArrayAdapter<Integer>(this,R.layout.testo); final List<Integer> arrListMin=new ArrayList<Integer>(Arrays.asList(1,2,3,4,5)); final ArrayAdapter<Integer> adapterMin=new ArrayAdapter<Integer>(this,R.layout.testo); for(Integer i:arrListHr) adapterHr.add(i); for(Integer i:arrListMin) adapterMin.add(i); spinnerHr.setAdapter(adapterHr); spinnerMin.setAdapter(adapterMin); spinnerHr.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object item=parent.getSelectedItem(); Integer selectedItem=(Integer)item; adapterMin.clear(); for(Integer i : arrListMin){ if(i+selectedItem<5) adapterMin.add(i); } } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } }); spinnerMin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object item=parent.getSelectedItem(); Integer selectedItem=(Integer)item; adapterHr.clear(); for(Integer i: arrListHr){ if(i+selectedItem<5) adapterHr.add(i); } } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } }); } }
Uso il costruttore di ArrayAdapter che prende come parametri soltanto il Context e la risorsa XML da inflatare, per poi riempire a mano l'ArrayAdapter di ciascuno Spinner, in modo da poter selezionare gli elementi con cui riempirlo.
Sistemo un po' meglio il codice.
Creo un ArrayList chiamata arrListHr, che è per lo Spinner delle ore (che diventerà nel mio progetto quello delle ore); quindi creo un ArrayAdapter chiamato adapterHr, sempre per lo stesso Spinner.
Infine popolo l'adapterHr con gli elementi dell'arrListHr uno per uno:
final List<Integer> arrListHr=new ArrayList<Integer>(Arrays.asList(1,2,3,4,5)); final ArrayAdapter<Integer> adapterHr=new ArrayAdapter<Integer>(this,R.layout.testo); for(Integer i:arrListHr) adapterHr.add(i);Faccio la stessa cosa con lo Spinner dei minuti (che lo diventerà nel mio progetto):
final List<Integer> arrListMin=new ArrayList<Integer>(Arrays.asList(1,2,3,4,5)); final ArrayAdapter<Integer> adapterMin=new ArrayAdapter<Integer>(this,R.layout.testo); for(Integer i:arrListMin) adapterMin.add(i);Ora attribuisco gli adapter agli Spinner:
spinnerHr.setAdapter(adapterHr); spinnerMin.setAdapter(adapterMin);Una volta popolati gli adapter, potrei far partire gli Spinner con l'evento onSelectedItem.
Ma ad ognuno di questi eventi bisogna manipolare l'adapter dell'altro spinner, popolandolo selettivamente in relazione alla selezione del primo, e fare il reciproco col primo per la selezione del secondo.
Così, quando viene selezionato il primo, devo manipolare l'adapter del secondo in questo modo:
Innanzitutto casto a Integer l'elemento selezionato che è di tipo Object:
spinnerHr.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object item=parent.getSelectedItem(); Integer selectedItem=(Integer)item;quindi ripulisco l'adapter dell'altro Spinner e lo ripopolo con gli elementi provenienti dalla relativa ArrayList, ma solo se soddisfano un determinato criterio, che in questo caso è il fatto che la somma con l'elemento selezionato in questo Spinner sia inferiore a 5.
adapterMin.clear(); for(Integer i : arrListMin){ if(i+selectedItem<5) adapterMin.add(i); }E il gioco è fatto!
Ora teniamo conto che spinnerHr contenga ore e spinnerMin contenga minuti.
Ricreo le ArrayList.
final List<Integer> arrListHr=new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5)); final ArrayAdapter<Integer> adapterHr = new ArrayAdapter<Integer>(this,R.layout.testo); for(Integer i:arrListHr)adapterHr.add(i); final List<Integer> arrListMin=new ArrayList<Integer>(Arrays.asList(0,5,10,15,20,25,30,35,40,45,50,55)); final ArrayAdapter<Integer> adapterMin=new ArrayAdapter<Integer>(this,R.layout.testo); for(Integer i:arrListMin) adapterMin.add(i);E vediamo cosa accade quando si seleziona un elemento.
La chiave è la condizione da soddisfare.
Voglio, ad esempio, che la somma non sia più di un'ora e mezza (90 minuti).
spinnerHr.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object item=parent.getSelectedItem(); Integer selectedItem=(Integer)item; adapterMin.clear(); for(Integer i : arrListMin){ if((i+selectedItem*60)<91) adapterMin.add(i); } } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } }); spinnerMin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object item=parent.getSelectedItem(); Integer selectedItem=(Integer)item; adapterHr.clear(); for(Integer i: arrListHr){ if((i*60+selectedItem)<91) adapterHr.add(i); } } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } });E vediamo...
Sì! E' riuscito perfettamente! Aumentiamo il limite di tempo a due ore e mezza.
Perfetto!
Nessun commento:
Posta un commento