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