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-Methode OnCreate
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 ListView
Eigenschaft 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 Haupteinschrä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[]
GetView
GetItemId
Count
.
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. DiesCursorAdapter
kümmert sich um Recyclingansichten (im Gegensatz zurGetView
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 ListView
Cursor, und CursorAdapter
weisen Sie ihn dann der Listenansicht zu.
Der Code, der diese Aktion in der CursorTableAdapter/HomeScreen.cs-Methode OnCreate
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.