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.cs OnCreate
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 ListView
proprié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 GetView
pas , GetItemId
Count
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. IlCursorAdapter
s’occupera des vues de recyclage (contrairement à laGetView
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 ListView
curseur, créez le curseur, puis CursorAdapter
affectez-le à l’affichage de liste.
Le code qui effectue cette action dans la méthode CursorTableAdapter/HomeScreen.cs OnCreate
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.