38 votes

Obtenir l'élément sélectionné à partir d'une ListView liée à SimpleCursorAdapter

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

J'ai une activité 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);

Ensuite, lorsqu'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 qui a été sélectionné ? Cela semble étrange, car je ne pensais pas pouvoir utiliser mon curseur après la fermeture de la base de données (ce qui est le cas après la liaison). Quel est l'intérêt de passer l'identifiant, alors que je n'arrive pas à trouver un moyen d'obtenir l'élément réel à partir de cet identifiant ? Je ne comprends pas non plus pourquoi getItemAtPosition() renvoie un curseur... le curseur est lié à la liste entière, pas seulement à une ligne. Enfin, si cela est correct, y a-t-il une différence entre les deux façons d'obtenir le curseur ? Je vous remercie.

83voto

Femi Points 42054

Quelques points : après avoir récupéré le curseur, vous devez appeler startManagingCursor . Cela permet de lier 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);

De plus, la base de données n'est pas fermé Le curseur maintient généralement une connexion directe avec la base de données (afin que la liste puisse défiler et faire des choses de cette nature qui peuvent nécessiter un accès futur au contenu du curseur).

Pour répondre à votre question principale, la manière la plus simple de le faire en onListItemClick est la suivante :

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

Vous pouvez alors utiliser la fonction c.getLong(0) pour obtenir l'id (en supposant que vous ayez récupéré la colonne id en tant que première colonne, ce qui est généralement le cas). Cependant, notez que l'identifiant est transmis dans le cadre de la signature (voir le dernier argument dans public void onListItemClick(ListView l, View v, int position, long id) ), de sorte qu'il n'est pas vraiment nécessaire de les récupérer à nouveau (mais vous pouvez certainement le faire si vous voulez brûler les cycles). Pour accéder à d'autres colonnes, vous pouvez faire la même chose, en changeant simplement l'index de la colonne.

J'espère que cela vous aidera.

2voto

Iuliia Points 198

D'une autre manière :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X