Freigeben über


Verwenden von CursorAdapters mit Xamarin.Android

Android bietet Adapterklassen speziell zum Anzeigen von Daten aus einer SQLite-Datenbankabfrage:

SimpleCursorAdapter – Ähnlich wie eine ArrayAdapter , da sie ohne Unterklassen verwendet werden kann. Geben Sie einfach die erforderlichen Parameter (z. B. einen Cursor und Layoutinformationen) im Konstruktor an, und weisen Sie dann einem ListView.

CursorAdapter – Eine Basisklasse, von der Sie erben können, wenn Sie mehr Kontrolle über die Bindung von Datenwerten an Layoutsteuerelemente benötigen (z. B. Ausblenden/Anzeigen von Steuerelementen oder Ändern ihrer Eigenschaften).

Cursoradapter bieten eine leistungsstarke Möglichkeit, durch lange Listen mit Daten zu scrollen, die in SQLite gespeichert sind. Der verbrauchende Code muss eine SQL-Abfrage in einem Cursor Objekt definieren und dann beschreiben, wie die Ansichten für jede Zeile erstellt und aufgefüllt werden.

Erstellen einer SQLite-Datenbank

Zum Veranschaulichen von Cursoradaptern ist eine einfache SQLite-Datenbankimplementierung erforderlich. Der Code in SimpleCursorTableAdapter/VegetableDatabase.cs enthält den Code und SQL, um eine Tabelle zu erstellen und mit einigen Daten aufzufüllen. Die vollständige VegetableDatabase Klasse wird hier gezeigt:

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

Die VegetableDatabase Klasse wird in der OnCreate Methode der HomeScreen Aktivität instanziiert. Die SQLiteOpenHelper Basisklasse verwaltet das Setup der Datenbankdatei und stellt sicher, dass die SQL-Datei in ihrer OnCreate Methode nur einmal ausgeführt wird. Diese Klasse wird in den folgenden beiden Beispielen für SimpleCursorAdapter und CursorAdapter.

Die Cursorabfrage muss eine ganzzahlige Spalte _id aufweisen, damit die CursorAdapter Aufgabe funktioniert. Wenn die zugrunde liegende Tabelle keine ganzzahlige Spalte mit dem Namen _id hat, verwenden Sie einen Spaltenalias für eine andere eindeutige ganze Zahl im RawQuery Cursor. Weitere Informationen finden Sie in den Android-Dokumenten .

Erstellen des Cursors

In den Beispielen wird eine RawQuery SQL-Abfrage in ein Cursor Objekt umgewandelt. Die vom Cursor zurückgegebene Spaltenliste definiert die Datenspalten, die für die Anzeige im Cursoradapter verfügbar sind. Der Code, der die Datenbank in der SimpleCursorTableAdapter/HomeScreen.cs-MethodeOnCreate erstellt, wird hier gezeigt:

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

Jeder Code, der aufruft StartManagingCursor , sollte auch aufgerufen werden StopManagingCursor. In den Beispielen wird OnCreate der Cursor gestartet und OnDestroy geschlossen. Die OnDestroy Methode enthält diesen Code:

StopManagingCursor(cursor);
cursor.Close();

Sobald eine Anwendung über eine SQLite-Datenbank verfügt und wie dargestellt ein Cursorobjekt erstellt hat, kann sie entweder eine SimpleCursorAdapter oder eine Unterklasse von zum Anzeigen von CusorAdapter Zeilen in einer .ListView

Verwenden von SimpleCursorAdapter

SimpleCursorAdapter ist wie die ArrayAdapter, aber spezialisiert für die Verwendung mit SQLite. Es ist keine Unterklassen erforderlich – legen Sie beim Erstellen des Objekts nur einige einfache Parameter fest und weisen sie dann einer ListViewEigenschaft Adapter zu.

Die Parameter für den SimpleCursorAdapter-Konstruktor sind:

Kontext – Ein Verweis auf die enthaltende Aktivität.

Layout – Die Ressourcen-ID der zu verwendenden Zeilenansicht.

ICursor – Ein Cursor, der die SQLite-Abfrage für die anzuzeigenden Daten enthält.

Aus Zeichenfolgenarray – Ein Array von Zeichenfolgen, die den Namen der Spalten im Cursor entsprechen.

Zum ganzzahligen Array – Ein Array von Layout-IDs, die den Steuerelementen im Zeilenlayout entsprechen. Der Wert der im from Array angegebenen Spalte wird an die in diesem Array angegebene ControlID am gleichen Index gebunden.

Die from Und to Arrays müssen dieselbe Anzahl von Einträgen aufweisen, da sie eine Zuordnung von der Datenquelle zu den Layoutsteuerelementen in der Ansicht bilden.

Der Beispielcode "SimpleCursorTableAdapter/HomeScreen.cs " wird wie folgt verkabelt SimpleCursorAdapter :

// 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 ist eine schnelle und einfache Möglichkeit zum Anzeigen von SQLite-Daten in einem ListView. Die Standard Einschränkung besteht darin, dass spaltenwerte nur an Anzeigesteuerelemente gebunden werden können. Es ist nicht möglich, andere Aspekte des Zeilenlayouts zu ändern (z. B. Anzeigen/Ausblenden von Steuerelementen oder Ändern von Eigenschaften).

UnterklassencursorAdapter

Eine CursorAdapter Unterklasse bietet die gleichen Leistungsvorteile wie das SimpleCursorAdapter Anzeigen von Daten aus SQLite, bietet ihnen aber auch die vollständige Kontrolle über die Erstellung und das Layout jeder Zeilenansicht. Die CursorAdapter Implementierung unterscheidet sich sehr von der UnterklasseBaseAdapter, da sie weder außer Kraft noch Indexer überschreibt this[]GetViewGetItemIdCount.

Bei einer funktionierenden SQLite-Datenbank müssen Sie nur zwei Methoden überschreiben, um eine CursorAdapter Unterklasse zu erstellen:

  • BindView – Aktualisieren Sie sie aufgrund einer Ansicht so, dass die Daten im bereitgestellten Cursor angezeigt werden.

  • NewView – Wird aufgerufen, wenn für die ListView Anzeige eine neue Ansicht erforderlich ist. Dies CursorAdapter kümmert sich um Recyclingansichten (im Gegensatz zur GetView Methode für normale Adapter).

Die Adapterunterklassen in früheren Beispielen verfügen über Methoden zum Zurückgeben der Anzahl von Zeilen und zum Abrufen des aktuellen Elements – dies CursorAdapter erfordert diese Methoden nicht, da diese Informationen vom Cursor selbst gegledert werden können. Durch Das Aufteilen der Erstellung und Population jeder Ansicht in diese beiden Methoden erzwingt die erneute Verwendung der CursorAdapter Ansicht. Dies ist im Gegensatz zu einem regulären Adapter, bei dem der convertView Parameter der BaseAdapter.GetView Methode ignoriert werden kann.

Implementieren des CursorAdapters

Der Code in CursorTableAdapter/HomeScreenCursorAdapter.cs enthält eine CursorAdapter Unterklasse. Er speichert einen Kontextverweis, der an den Konstruktor übergeben wird, damit er auf eine LayoutInflater in der NewView Methode zugreifen kann. Die vollständige Klasse sieht wie folgt aus:

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

Zuweisen des CursorAdapters

Erstellen Sie in der Activity daraufhin angezeigten Ansicht den ListViewCursor, und CursorAdapter weisen Sie ihn dann der Listenansicht zu.

Der Code, der diese Aktion in der CursorTableAdapter/HomeScreen.cs-MethodeOnCreate ausführt, wird hier gezeigt:

// 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);

Die OnDestroy Methode enthält den StopManagingCursor zuvor beschriebenen Methodenaufruf.