2011-05-11 9 views
5

Sto tentando di utilizzare un controllo di selezione che consentirà all'utente di eliminare qualsiasi elemento dell'elenco. Ho un pulsante "aggiungi" per aggiungere elementi all'elenco e un pulsante "elimina" che rimuove l'elemento attualmente visualizzato dall'elenco.L'eliminazione dell'ultimo elemento dalla casella di selezione elimina l'intero elenco

Funziona come previsto tranne quando l'utente elimina l'ultimo elemento nell'elenco. A quel punto, tutti gli elementi della lista vengono cancellati.

Il mio codice è il seguente:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

    // grab our UI elements so we can manipulate them (for the Spinner) 
    // or add listeners to them (in the case of the buttons) 
    m_myDynamicSpinner = (Spinner)findViewById(R.id.dynamicSpinner); 
    m_addItemText = (EditText)findViewById(R.id.newSpinnerItemText); 
    Button addButton = (Button)findViewById(R.id.AddBtn); 
    Button clearButton = (Button)findViewById(R.id.ClearBtn); 

    // create an arrayAdapter an assign it to the spinner 
    m_adapterForSpinner = new ArrayAdapter(this, android.R.layout.simple_spinner_item); 
     ((ArrayAdapter)m_adapterForSpinner).setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    m_myDynamicSpinner.setAdapter(m_adapterForSpinner); 

    // add listener for addButton 
    addButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      addNewSpinnerItem(); 
     } 
    }); 

    clearButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      clearSpinnerItems(); 
     } 
    }); 
} 

// add listener for addButton 
private void addNewSpinnerItem() { 
    if (m_addItemText.getText().length() == 0) { 
     Toast.makeText(getApplicationContext(), "The textView is empty", Toast.LENGTH_LONG).show(); 
    } else { 
     CharSequence textHolder = "" + m_addItemText.getText(); 
     ((ArrayAdapter) m_adapterForSpinner).add(textHolder); 
    } 
    m_addItemText.setText(""); 
} 

private void clearSpinnerItems() { 
    m_myDynamicSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
      Object t = m_adapterForSpinner.getItem(pos); 
      ((ArrayAdapter) m_adapterForSpinner).remove((CharSequence) t); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO 
     } 
    }); 
} 

Qualcuno ha idee o suggerimenti su come fare questo lavoro?

+0

Hai un setSingleChoiceItems o setMultiChoiceItems in filatore e, si può plz fornire qualche codice in modo che possiamo aiutare in modo migliore –

+0

quale risposta? entri in Log.v ("Articolo rimosso", t + ""); ? –

+0

utilizzando Log.v ("Elemento rimosso", t + ""); ottengo l'oggetto selezionato ma non riesco a cancellare l'oggetto selezionato. – Hisenberg

risposta

1

Non riesco a capire la tua domanda. In ogni modo puoi ottenere la posizione dell'oggetto selezionato usando il metodo getSelectedItemPosition().

+1

consultare il segmento di codice e dimmi wat m facendo male – Shruti

+0

m utilizzando android.R.layout.simple_spinner_dropdown_item – Shruti

+0

e android.R.layout.simple_spinner_item – Shruti

4

Il problema con il codice è che la cancellazione si trova all'interno del callback selezionato onItemSelected, che viene chiamato ogni volta che si elimina una voce, eliminando così ricorsivamente finché non si hanno effettivamente più voci da selezionare. Se aggiungi un registro all'interno di tale metodo:

Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount()); 

vedrai cosa intendo. Sono sicuro che puoi trovare un codice più elegante, ma un trucco veloce e sporco è impostare un flag booleano per fermare la ricorsione dopo la prima cancellazione. Vedere il frammento di sotto e aggiungere le righe di commento per il proprio codice:

public class SpinnerTest extends Activity { 
    Spinner m_myDynamicSpinner; 
    EditText m_addItemText; 
    ArrayAdapter m_adapterForSpinner; 

    public static boolean cleared = false; // <--- set up a static boolean here 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
// all your code unchanged 

     clearButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 

       cleared=false; // <--- nope, we did not clear the value yet 

       clearSpinnerItems(); 
      } 
     }); 
    } 

// code unchanged 

    private void clearSpinnerItems() { 
     m_myDynamicSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

      public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
       Object t = m_adapterForSpinner.getItem(pos); 
       Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount()); 

       if (!cleared) // <--- did I do it already? 

        ((ArrayAdapter) m_adapterForSpinner).remove((CharSequence) t); 

       Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount()); 

       cleared=true; // I did it! 

      } 

// code unchanged 
+1

questo è giusto, dopo aver rimosso un oggetto lo Spinner ne seleziona uno nuovo e si chiama fino a quando non rimane nessun oggetto. Xou shoud non registra un Listener onitemselect ma seleziona l'elemento che desideri eliminare ed elimina cliccando sul pulsante – 2red13

+0

@ 2red13 sì, è quello che farei anch'io, ma suppongo che questo sia un caso di test per un codice che non ho visto , quindi sto dando la soluzione che cambia la struttura meno. In effetti, questo approccio ha un secondo problema: non è possibile eliminare l'opzione che è già selezionata (poiché non si attiva suItemSelected). – Aleadam

+0

sì :) ho capito il codice ur ha funzionato per me grazie :) – Hisenberg

Problemi correlati