web-dev-qa-db-fra.com

Obtenir l'élément sélectionné de ListView lié à SimpleCursorAdapter

Je suis nouveau dans le développement Android ... venant de fond iPhone et .Net. J'ai vu des questions très similaires à celle-ci, mais aucune d'entre elles ne traitait de SimpleCursorAdapter.

J'ai une ListActivity de base qui utilise un curseur pour lier les données d'une requête SQLite à mon ListView:

ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        Android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {Android.R.id.text1}); 

setListAdapter(adapter);

Puis quand un élément est cliqué:

public void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position,  id);

    //Difference between this:
    Cursor c = (cursor)l.getItemAtPosition(position);
    //and this??
    Cursor c = (Cursor)l.getAdapter().getItem(position);

    int categoryId = c.getInt(0);
}

Est-ce la bonne façon d'obtenir l'identifiant de l'élément sélectionné? Cela semble étrange, car je ne pensais pas pouvoir utiliser mon curseur après la fermeture de la base de données (c'est-à-dire après la liaison). Quel est le but de l'identifiant transmis, lorsque je n'arrive pas à trouver le moyen d'obtenir le produit à partir de cet identifiant? De plus, je ne comprends pas pourquoi la méthode getItemAtPosition () renvoie un curseur ... le curseur est lié à la liste entière; pas seulement une rangée. Enfin, si cela est correct, existe-t-il une différence entre les deux méthodes présentées pour obtenir le curseur? Merci.

36
GendoIkari

Quelques points: après avoir récupéré le curseur, vous voulez appeler startManagingCursor. Cela lie le cycle de vie du curseur au cycle de vie de l'activité (ainsi, lorsque l'activité est détruite, le curseur est fermé/nettoyé).

startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        Android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {Android.R.id.text1}); 
setListAdapter(adapter);

En outre, la base de données n'est pas fermée , le curseur conserve généralement une connexion en direct à la base de données (afin que ListView puisse faire défiler et exécuter des opérations de ce type pouvant nécessiter un accès ultérieur au contenu du curseur.

Pour votre question principale, la manière la plus simple de le faire dans onListItemClick est la suivante:

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);

Vous pouvez ensuite utiliser c.getLong(0) pour obtenir l'identifiant (en supposant que vous ayez récupéré la colonne id comme première colonne, ce qui est généralement le cas). Cependant, notez que l'id est transmis dans le cadre de la signature (voir le dernier argument dans public void onListItemClick(ListView l, View v, int position, long id)), vous n'avez donc pas besoin de le récupérer (mais vous pouvez le faire si vous voulez graver les cycles). Pour accéder aux autres colonnes, vous pouvez faire la même chose, il suffit de modifier l’index des colonnes.

J'espère que cela pourra aider.

81
Femi

Autrement:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);
            //TODO
            }
});
0
Yuliia Ashomok