2011-11-08 4 views
1

J'ai terminé la partie 2 du didacticiel du Bloc-notes et tout fonctionne correctement. Mais il y a une chose que je ne peux pas simplement comprendre pourquoi il travaille;)Didacticiel sur le bloc-notes Android - onListItemClick

Le rappel onListItemClick retreives les paramètres:

  • ListView l - Vérifier
  • Voir v - Vérifier
  • position - Position de l'article sur lequel l'utilisateur a cliqué, en commençant par un index à base zéro (à droite?)
  • id - ID de ligne de l'article sur lequel l'utilisateur a cliqué

Cela semble être le même rowId comme utilisé dans le tableau SqlLite DB « notes » ... mais où diable fait le ListActivity connaissent que nous utilisons cette colonne comme ID de ligne? Je n'ai trouvé aucun mappage entre la liste et la table DB, juste le curseur que nous avons lié dans fillData. Mais il n'y a qu'un mappage entre la colonne Titre et l'ID text1 dans l'interface utilisateur. Alors où est la liaison rowId? Et si je voulais changer cette liaison à une autre source?

Thx à l'avance Alex

+0

de la colonne _id dans Cursor ... – Selvin

Répondre

0

Le SimpleCursorAdapter (dans la méthode fillData()) lie les données de la base de données curseur sur la liste image. Chaque fois qu'un élément est cliqué, CursorAdapter réalise quel élément est cliqué et transmet l'identifiant à l'activité de liste.

+0

Merci pour votre réponse. Mais qu'en est-il de l'opération deleteNote() dans NotesDBAdapter? Il reçoit rowId et exécute une opération de suppression comme return mDb.delete (DATABASE_TABLE, KEY_ROWID + "=" + rowId, null). La méthode dleteNote() est appelée dans onContextItemSelected() avec AdapterContextMenuInfo.id. Cela ne signifie-t-il pas également que rowId dans l'interface utilisateur doit être identique dans la base de données? Ou est-ce juste par "aléatoire"? Désolé je suis confus;) –

0

Ce n'est pas un rowID comme dans SQL. Les bases de données sont complètement différentes des éléments de formulaire.

rowID dans ce contexte est tout simplement un indice de 0 à vous dire ce que vous cliquez sur. Votre curseur est simplement en train de remplir des données dans ListView à partir d'une table. À moins que vous ne fassiez des requêtes directes avec ContentProviders ou des requêtes SQLite, vous ne devriez pas avoir à sélectionner les lignes.

J'espère que cela aide!

+0

Merci pour votre réponse, mais cela soulève 2 autres questions: Si ce n'est pas le rowID de la DB, pourquoi pouvons-nous simplement mettre le paramètre 'id' de la méthode onListItemClick à l'intention comme editIntent.putExtra (NotesDbAdapter.KEY_ROWID, id)? Cela impliquerait que DB.rowID = ListView.Id. L'autre question est la différence entre la position et le paramètre d'id? Dans mon exemple, j'ai eu 2 entrées et j'ai cliqué sur le 2ème ayant la position = 1 et rowId = 4 en supposant que j'ai ajouté et supprimé des notes avant le débogage. –

+0

Quelles sont ces questions? – Codeman

+0

@Alexander Beer voir mon commentaire ... de toute façon ... il peut être ROWID de db ou tout autre PK de votre table ... tout ce que vous devez faire est de le "renommer" dans la requête comme "SELECT blabla AS _id, reste , colonnes, allez, ici FROM table "... EDIT: oublié de mentionner ... AFAIK dans sqlite si vous utilisez votre propre entier/PK long, les points ROWID à cette colonne – Selvin

Questions connexes