web-dev-qa-db-fra.com

définir onClickListener pour l'élément spinner?

J'ai spinner qui remplit la base de données:

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

Et je veux appeler AlertDialog lorsque je sélectionne le dernier élément (Add new category...).
Après avoir ajouté une nouvelle catégorie, je veux que "l'élément (Add new category...) "était à nouveau le dernier.
Comment puis-je faire ceci?

24

Vous NE DEVRIEZ PAS appeler OnItemClickListener sur un spinner. Un Spinner ne prend pas en charge les événements de clic sur un élément. L'appel de cette méthode déclenche une exception. Vérifiez ceci .

Vous pouvez appliquer OnItemSelectedListener à la place.

Modifier:

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 ce qui concerne l'ajout de "Ajouter une nouvelle catégorie" à la fin de la liste, je pense que vous devriez mieux opter pour un adaptateur personnalisé dans lequel, après avoir ajouté tous vos articles, vous pouvez ajouter cette constante ("Ajouter une nouvelle catégorie") à la fin de tableau afin qu'il vienne toujours en dernier.

78
Braj

Accrochez-vous à OnItemClickListener de Spinner. Vérifiez ensuite si l'élément sélectionné est "Ajouter une nouvelle catégorie".

Si oui, affichez la boîte de dialogue pour ajouter le nouvel élément.

Lors de l'ajout du nouvel élément,

  1. Supprimez le dernier élément "Ajouter une nouvelle catégorie".
  2. Ajoutez la nouvelle catégorie entrée.
  3. Ensuite, ajoutez à nouveau l'élément "Ajouter une nouvelle catégorie".

Cela fera de l'élément "Ajouter une nouvelle catégorie" le dernier.

Échantillon de code:

layout 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>

mise en page 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 d'activité:

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

}
6
Eldhose M Babu