Partager via


Utilisation de CursorAdapters avec Xamarin.Android

Android fournit des classes d’adaptateur spécifiquement pour afficher des données à partir d’une requête de base de données SQLite :

SimpleCursorAdapter : similaire à un ArrayAdapter , car il peut être utilisé sans sous-classe. Fournissez simplement les paramètres requis (par exemple, un curseur et des informations de disposition) dans le constructeur, puis attribuez-lui un ListView.

CursorAdapter : classe de base dont vous pouvez hériter lorsque vous avez besoin d’un contrôle supplémentaire sur la liaison de valeurs de données aux contrôles de disposition (par exemple, masquage/affichage de contrôles ou modification de leurs propriétés).

Les adaptateurs de curseur offrent un moyen hautes performances de faire défiler les longues listes de données stockées dans SQLite. Le code consommateur doit définir une requête SQL dans un Cursor objet, puis décrire comment créer et remplir les vues pour chaque ligne.

Création d’une base de données SQLite

Pour illustrer les adaptateurs de curseur, vous devez implémenter une base de données SQLite simple. Le code de SimpleCursorTableAdapter/VegetableDatabase.cs contient le code et SQL pour créer une table et la remplir avec certaines données. La classe complète VegetableDatabase s’affiche ici :

class VegetableDatabase  : SQLiteOpenHelper {
   public static readonly string create_table_sql =
       "CREATE TABLE [vegetables] ([_id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, [name] TEXT NOT NULL UNIQUE)";
   public static readonly string DatabaseName = "vegetables.db";
   public static readonly int DatabaseVersion = 1;
   public VegetableDatabase(Context context) : base(context, DatabaseName, null, DatabaseVersion) { }
   public override void OnCreate(SQLiteDatabase db)
   {
       db.ExecSQL(create_table_sql);
       // seed with data
       db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Vegetables')");
       db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Fruits')");
       db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Flower Buds')");
       db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Legumes')");
       db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Bulbs')");
       db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Tubers')");
   }
   public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
   {   // not required until second version :)
       throw new NotImplementedException();
   }
}

La VegetableDatabase classe est instanciée dans la OnCreate méthode de l’activité HomeScreen . La SQLiteOpenHelper classe de base gère la configuration du fichier de base de données et garantit que le sql dans sa OnCreate méthode n’est exécuté qu’une seule fois. Cette classe est utilisée dans les deux exemples suivants pour SimpleCursorAdapter et CursorAdapter.

La requête de curseur doit avoir une colonne _id entière pour que le CursorAdapter travail fonctionne. Si la table sous-jacente n’a pas de colonne entière nommée _id , utilisez un alias de colonne pour un autre entier unique dans celui RawQuery qui compose le curseur. Pour plus d’informations, reportez-vous à la documentation Android.

Création du curseur

Les exemples utilisent un RawQuery pour transformer une requête SQL en objet Cursor . La liste de colonnes retournée par le curseur définit les colonnes de données disponibles pour l’affichage dans l’adaptateur de curseur. Le code qui crée la base de données dans la méthode SimpleCursorTableAdapter/HomeScreen.csOnCreate est illustré ici :

vdb = new VegetableDatabase(this);
cursor = vdb.ReadableDatabase.RawQuery("SELECT * FROM vegetables", null); // cursor query
StartManagingCursor(cursor);
// use either SimpleCursorAdapter or CursorAdapter subclass here!

Tout code qui appelle StartManagingCursor doit également appeler StopManagingCursor. Les exemples permettent OnCreate de démarrer et OnDestroy de fermer le curseur. La OnDestroy méthode contient ce code :

StopManagingCursor(cursor);
cursor.Close();

Une fois qu’une application dispose d’une base de données SQLite disponible et a créé un objet de curseur comme indiqué, il peut utiliser une SimpleCursorAdapter ou une sous-classe pour CusorAdapter afficher des lignes dans un ListView.

Utilisation de SimpleCursorAdapter

SimpleCursorAdapter est comme le ArrayAdapter, mais spécialisé pour une utilisation avec SQLite. Il ne nécessite pas de sous-classe : il vous suffit de définir des paramètres simples lors de la création de l’objet, puis de l’affecter à une ListViewpropriété 's Adapter .

Les paramètres du constructeur SimpleCursorAdapter sont les suivants :

Contexte : référence à l’activité conteneur.

Disposition : ID de ressource de la vue de ligne à utiliser.

ICursor : curseur contenant la requête SQLite pour que les données s’affichent.

À partir du tableau de chaînes : tableau de chaînes correspondant aux noms des colonnes dans le curseur.

Tableau entier : tableau d’ID de disposition correspondant aux contrôles de la disposition de ligne. La valeur de la colonne spécifiée dans le from tableau sera liée à l’ID de contrôle spécifié dans ce tableau au même index.

Les from tableaux et to les tableaux doivent avoir le même nombre d’entrées, car elles forment un mappage de la source de données aux contrôles de disposition dans la vue.

L’exemple de code SimpleCursorTableAdapter/HomeScreen.cs relie un SimpleCursorAdapter exemple de code semblable à ceci :

// which columns map to which layout controls
string[] fromColumns = new string[] {"name"};
int[] toControlIDs = new int[] {Android.Resource.Id.Text1};
// use a SimpleCursorAdapter
listView.Adapter = new SimpleCursorAdapter (this, Android.Resource.Layout.SimpleListItem1, cursor,
       fromColumns,
       toControlIDs);

SimpleCursorAdapter est un moyen rapide et simple d’afficher des données SQLite dans un ListView. La limitation principale est qu’elle ne peut lier que des valeurs de colonne à des contrôles d’affichage, elle ne vous permet pas de modifier d’autres aspects de la disposition de ligne (par exemple, afficher/masquer des contrôles ou modifier des propriétés).

Sous-classe CursorAdapter

Une CursorAdapter sous-classe présente les mêmes avantages en matière de performances que pour l’affichage SimpleCursorAdapter des données à partir de SQLite, mais elle vous donne également un contrôle total sur la création et la disposition de chaque vue de ligne. L’implémentation CursorAdapter est très différente de la BaseAdapter sous-classe, car elle ne remplace GetViewpas , GetItemIdCount ou this[] indexeur.

Étant donné une base de données SQLite opérationnelle, vous devez uniquement remplacer deux méthodes pour créer une CursorAdapter sous-classe :

  • BindView : en fonction d’une vue, mettez-la à jour pour afficher les données dans le curseur fourni.

  • NewView : appelé lorsque l’affichage ListView d’une nouvelle vue est nécessaire. Il CursorAdapter s’occupera des vues de recyclage (contrairement à la GetView méthode sur les adaptateurs réguliers).

Les sous-classes de l’adaptateur dans les exemples précédents ont des méthodes permettant de retourner le nombre de lignes et de récupérer l’élément actuel, ce qui CursorAdapter ne nécessite pas ces méthodes, car ces informations peuvent être glanées à partir du curseur lui-même. En fractionnant la création et la population de chaque vue en ces deux méthodes, l’affichage CursorAdapter applique une réutilisation de la vue. Contrairement à un adaptateur normal, il est possible d’ignorer le convertView paramètre de la BaseAdapter.GetView méthode.

Implémentation du CursorAdapter

Le code dans CursorTableAdapter/HomeScreenCursorAdapter.cs contient une CursorAdapter sous-classe. Il stocke une référence de contexte passée dans le constructeur afin qu’elle puisse accéder à une LayoutInflater référence de contexte dans la NewView méthode. La classe complète ressemble à ceci :

public class HomeScreenCursorAdapter : CursorAdapter {
   Activity context;
   public HomeScreenCursorAdapter(Activity context, ICursor c)
       : base(context, c)
   {
       this.context = context;
   }
   public override void BindView(View view, Context context, ICursor cursor)
   {
       var textView = view.FindViewById<TextView>(Android.Resource.Id.Text1);
       textView.Text = cursor.GetString(1); // 'name' is column 1 in the cursor query
   }
   public override View NewView(Context context, ICursor cursor, ViewGroup parent)
   {
       return this.context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, parent, false);
   }
}

Affectation du CursorAdapter

Dans l’affichage Activity qui affiche le ListViewcurseur, créez le curseur, puis CursorAdapter affectez-le à l’affichage de liste.

Le code qui effectue cette action dans la méthode CursorTableAdapter/HomeScreen.csOnCreate est illustré ici :

// create the cursor
vdb = new VegetableDatabase(this);
cursor = vdb.ReadableDatabase.RawQuery("SELECT * FROM vegetables", null);
StartManagingCursor(cursor);

// create the CursorAdapter
listView.Adapter = (IListAdapter)new HomeScreenCursorAdapter(this, cursor, false);

La OnDestroy méthode contient l’appel StopManagingCursor de méthode décrit précédemment.