2012-08-24 746 views
14

tengo spinner, que rellena la base de datos:¿Has configurado ClickListener para el elemento giratorio?

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); 

Y quiero llamar AlertDialog cuando selecciono último elemento (Add new category...).
Después de que agregué una nueva categoría, quiero que "el artículo (Add new category...)" haya sido el último nuevamente.
¿Cómo puedo hacer esto?

Respuesta

49

Usted NO DEBE llame al OnItemClickListener para un girador. Un Spinner no admite eventos de clic de elementos. Llamar a este método generará una excepción. Compruebe this. Puede aplicar OnItemSelectedListener en su lugar.

Editar:

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) 
     { 

     }   
    }); 

En cuanto a la adición de "Añadir nueva categoría" al final de la lista es que se trate, creo que lo mejor será ir a por adaptador personalizado en el que después de añadir todos los artículos, puede agregar esa constante (Agregar nueva categoría) al final de la matriz para que siempre sea la última.

+0

Sé que esto. Pero ¿cómo puedo manejar en 'OnItemSelectedListener' seleccionado solo un elemento? –

+1

cuando selecciona cualquier artículo, obtendrá el artículo que seleccionó. Compare ese elemento seleccionado con su elemento predefinido, ya que es constante. Si el elemento seleccionado es ese elemento predefinido, realice su tarea – Braj

+0

No funciona. Creo que esto 'parent.getItemAtPosition (position) .toString();' devuelve position y lo convierte en string. –

5

Enganche a OnItemClickListener of Spinner. Luego verifique si el elemento seleccionado es "Agregar nueva categoría".

En caso afirmativo, muestre el cuadro de diálogo para agregar el nuevo elemento.

Mientras que la adición del nuevo elemento,

  1. eliminar el último elemento "Añadir nueva categoría".
  2. Agregar la nueva categoría ingresada.
  3. Luego, agregue nuevamente el ítem "Agregar nueva categoría".

Esto hará que el elemento "Agregar nueva categoría" sea el último.

Código de ejemplo:

diseño 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> 

diseño 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> 

Clase de actividad:

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

He actualizado la publicación con código de muestra. Por favor, compruebe. –

+0

un onitemclicklistener no se puede enganchar a un spinner – SoroushA

Cuestiones relacionadas