2012-08-24 18 views
14

Ho filatore che popola dal database:imposta onClickListener per l'elemento spinner?

catSpinner = (Spinner) findViewById(R.id.spinner1); 
cursor = dataAdapter.getAllCategory(); 
startManagingCursor(cursor); 
String[] from = new String[] { DataAdapter.CATEGORY_COL_NAME }; 
int[] to = new int[] { android.R.id.text1 }; 
SimpleCursorAdapter catAdapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_spinner_dropdown_item, cursor, from,to, 0); 
catAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
catAdapter.notifyDataSetChanged(); 
catSpinner.setAdapter(catAdapter); 

E voglio chiamare AlertDialog quando seleziono ultimo elemento (Add new category...).
Dopo aver aggiunto una nuova categoria, desidero che "l'articolo (Add new category...)" sia l'ultimo.
Come posso fare questo?

risposta

49

NON DOVREBBE chiamare OnItemClickListener per uno spinner. Una trottola non supporta gli eventi di clic sugli elementi. Chiamando questo metodo si genera un'eccezione. Controllare this. È possibile applicare OnItemSelectedListener invece.

Edit:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
    { 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
     { 
      String selectedItem = parent.getItemAtPosition(position).toString(); 
      if(selectedItem.equals("Add new category")) 
      { 
       // do your stuff 
      } 
     } // to close the onItemSelected 
     public void onNothingSelected(AdapterView<?> parent) 
     { 

     }   
    }); 

Per quanto riguarda l'aggiunta di "Aggiungi nuova categoria" al fine della lista è interessato, penso che si dovrebbe meglio andare per adattatore personalizzato in cui dopo l'aggiunta di tutti gli oggetti, puoi aggiungere quella costante (Aggiungi nuova categoria) alla fine dell'array in modo che arrivi sempre per sempre.

+0

Lo so. Ma come posso gestire in "OnItemSelectedListener" selezionato solo un elemento? –

+1

quando si seleziona un elemento, si otterrà quale elemento selezionato. Confronta l'elemento selezionato con l'elemento predefinito in quanto è costante. Se l'elemento selezionato è quell'elemento predefinito, esegui il tuo compito – Braj

+0

Non funziona. Penso che questo 'parent.getItemAtPosition (position) .toString();' restituisca la posizione e la converta in stringa. –

5

Collegamento a OnItemClickListener di Spinner. Quindi controlla se l'elemento selezionato è "Aggiungi nuova categoria".

Se sì, mostrare la finestra di dialogo per aggiungere il nuovo elemento.

Mentre l'aggiunta di un nuovo elemento,

  1. rimuovere l'ultimo elemento "Aggiungi nuova categoria".
  2. Aggiungi la nuova categoria immessa.
  3. Quindi aggiungere nuovamente la voce "Aggiungi nuova categoria".

Questo renderà l'elemento "Aggiungi nuova categoria" come ultimo.

codice di esempio:

disposizione main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:weightSum="10" > 

<Spinner 
    android:id="@+id/cmbNames" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

disposizione spinner_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/tvName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

Classe di attività:

public class MainActivity extends Activity { 

private static final String NAME = "name"; 
private static final String ADD_NEW_ITEM = "Add New Item"; 

private SimpleAdapter adapter; 
private Spinner cmbNames; 
private List<HashMap<String, String>> lstNames; 
private int counter; 

private OnItemSelectedListener itemSelectedListener = new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     HashMap<String, String> map = lstNames.get(arg2); 
     String name = map.get(NAME); 
     if (name.equalsIgnoreCase(ADD_NEW_ITEM)) { 
      lstNames.remove(map); 
      counter++; 
      addNewName(String.valueOf(counter)); 
      addNewName(ADD_NEW_ITEM); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 

    } 
}; 

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

    populateList(); 

    cmbNames = (Spinner) findViewById(R.id.cmbNames); 
    adapter = new SimpleAdapter(this, lstNames, R.layout.spinner_item, 
      new String[] { NAME }, new int[] { R.id.tvName }); 
    cmbNames.setAdapter(adapter); 
    cmbNames.setOnItemSelectedListener(itemSelectedListener); 
} 

private void populateList() { 
    lstNames = new ArrayList<HashMap<String, String>>(); 

    addNewName("abc"); 
    addNewName("pqr"); 
    addNewName("xyz"); 
    addNewName(ADD_NEW_ITEM); 
} 

private void addNewName(String name) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put(NAME, name); 
    lstNames.add(map); 
} 

} 
+1

Ho aggiornato il post con codice di esempio. Si prega di controllare. –

+0

un onitemclicklistener non può essere agganciato a uno spinner – SoroushA