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

Je suis tout nouveau pour le développement Android... venant de l'iPhone et de l'arrière-plan.net. J'ai vu des questions très similaires à celle-ci, mais aucune d'entre elles ne traitait du 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'id de l'élément qui est sélectionné? Cela semble étrange, parce que je ne pense pas que je pourrais utiliser mon curseur après la fermeture de la base de données (ce qui est après la liaison). Quel est le point de l'id passé, quand je n'arrive pas à trouver un moyen d'obtenir l'élément réel de cet id? De plus, Je ne comprends pas pourquoi getItemAtPosition() retournerait 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? Grâce.

36
demandé sur GendoIkari 2011-05-27 23:29:02

2 réponses

Donc quelques points: après avoir récupéré le curseur, vous voulez appeler startManagingCursor. Cela lie le cycle de vie du curseur avec le cycle de vie de L'activité (donc 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 (de sorte que ListView peut faire défiler et faire des choses de cette nature qui peuvent nécessiter un accès futur au contenu du curseur.

À votre question principale, le moyen le plus simple de faites-le dans onListItemClick est-ce:

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

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

J'espère que ça aide.

81
répondu Femi 2012-01-03 06:35:14

Une Autre façon:

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
répondu Yuliia Ashomok 2015-09-15 17:08:32