Spinner Eintrag hinzufügen

  • Antworten:19
  • Bentwortet
Sebastian Klaiber
  • Forum-Beiträge: 44

26.11.2010, 14:45:20 via Website

Hallo, wie kann man einen Spinner der über einen SimpleCursorAdapter geladen wird, einen manuellen Eintrag zur Laufzeit hinzufügen?

Hoffe das es verständlich ist was ich damit meine, ansonsten bitte gern nochmal nachfragen!

Danke

Mit freundlichen Grüßen

Sebastian

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

26.11.2010, 14:46:28 via Website

sowas in die richtung

adapter.add(NEUES_ITEM)

adapter.notifydatasetchanged()

swordiApps Blog - Website

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

26.11.2010, 14:51:37 via Website

ja genau, dass funktioniert aber leider nur für einen ArrayAdapter und nicht für einen Cursor so weit ich weiß oder täusche ich mich da?

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

26.11.2010, 15:07:07 via Website

ah cursoradapter - das kann natürlich dann sein

swordiApps Blog - Website

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

26.11.2010, 15:08:17 via Website

Gibt es dafür dann überhaupt eine Möglichkeit das Umzusetzen?

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

26.11.2010, 15:15:09 via Website

Also soweit ich weis geht das. Ich hab mal einen Spinner dynamisch mit Datenbankeinträgen befüllt. Ich hab bloß leider den Code nicht mehr parat.

Ich hab das damals durch google herausgefunden. Einfach mal suchen ;)

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

26.11.2010, 15:18:01 via Website

Ich habe schon bei Google gesucht hab leider nichts passendes gefunden. Wenn ich etwas finde dann immer nur Beispiele mit ArrayAdaptern! Deswegen habe ich auch einen Forums Eintrag geschrieben!

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

26.11.2010, 15:28:33 via Website

Hab auf der Seite

http://groups.google.com/group/android-developers/browse_thread/thread/7ae54bb7813a6c0a

den code

1Spinner s2 = (Spinner) findViewById(R.id.spinner2);
2 db.open();
3 Cursor cur = db.getAllTitles();
4 SimpleCursorAdapter cadapter = new SimpleCursorAdapter(this,
5android.R.layout.simple_spinner_item, cur,
6 new String[] {KEY_TITLE},
7 new int[] {android.R.id.text1});
8
9
10 cadapter.setDropDownViewResource
11(android.R.layout.simple_spinner_dropdown_item);
12 s2.setAdapter(cadapter);

gefunden (nicht getestet). Hoffe der Hilft dir vllt. weiter.

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

26.11.2010, 15:37:11 via Website

Danke für das Beispiel, der Spinner funktioniert eigentlich, ich will zu den Einträgen aus der Datenbank einen weiteren manuelle Eintrag hinzufügen wie z.b. "neue Kategorie"

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

26.11.2010, 16:19:51 via Website

So habe eine Lösung gefunden. Funktioniert aber leider nur teilweise. Denn nun fehlt mir die ID von der Datenbank beim ArrayAdapter habt Ihr dafür noch eine Idee wie ich das machen kann?

1private void fillCatagoriesSpinner() {
2 ArrayAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
3 adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
4 mCatagoriesSpinner.setAdapter(adapter);
5
6 Cursor catagoriesCursor = Category.findAll(mDb);
7 int accountnameIndex = catagoriesCursor.getColumnIndexOrThrow(Category.NAME);
8 if(catagoriesCursor.moveToFirst()){
9 do{
10 adapter.add(catagoriesCursor.getString(accountnameIndex));
11 } while(catagoriesCursor.moveToNext());
12 adapter.add("Neue Kategorie");
13 }

— geändert am 26.11.2010, 16:33:02

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

26.11.2010, 20:16:38 via Website

Hallo,

hast Du schon mal daran gedacht den Query entsprechend anzupassen statt das im Code zu machen? Ich hoffe ich habe Deine Frage richtig verstanden:

1select 0, 'Neue Kategorie'
2union all
3select spalte1IstNummer, spalte2IstText from tabelle

Das ist die SQLite Variante. habe das gerade ausprobiert und war überrascht das das geht. Bei "moderneren" SQL Dialekten kannst Du das über die "Values Clause" machen:

1values(0, 'Neue Kategorie')
2union all
3select spalte1IstNummer, spalte2IstText from tabelle

Ist jetzt aus dem Kopf - müsste aber gehen.

Gruß
Harald

— geändert am 26.11.2010, 20:20:12

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

28.11.2010, 15:10:56 via Website

Hallo,

will eigentlich den String "Neue Kategorie" nicht direkt in die Kategorie Tabelle schreiben.
Darum wollte ich nachdem die Kategorien aus der Datenbank geladen wurden ans ende des Spinners den String "Neue Kategorie" einfügen.

Das ganze funktioniert leider aktuell nur mit einem ArrayAdapter, da fehlen aber leider die ID's die beim CursorAdapter vorhanden sind.

Grüße

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

28.11.2010, 16:32:05 via Website

Du hast meinen Ansatz falsch verstanden.

Der Eintrag "Neue Kategorie" steht bei meinem Vorschlag nicht in der Tabelle sondern wird im Query manuell hinzugefügt. Schau nochmal genau hin.

Du kannst sogar "Order by" verwenden müßtest dann aber zum Beispiel "--- Neue Kategorie ---" schreiben. Und die von mir verwendete 0 als Key garantiert auch noch das Erkennen dieses Spezialschlüssels.

Gruß
Harald

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

30.11.2010, 17:36:58 via Website

Hi, ich glaub das ich deinen Ansatz immer noch nicht ganz verstanden habe. Hier mal meine Query mit dem ich die Kategorien in den Spinner lade! Wäre dir echt dankbar wenn du mir nochmal weiterhelfen könntest!

1public static Cursor findAll(SQLiteDatabase db) {
2 Cursor category_cursor = db.query(Category.TABLE_NAME,
3 new String[]{Category.ID, Category.NAME}, null, null, null, null, null);
4 return category_cursor;
5}

1private void fillFields() {
2 if (mDbItemId != null) {
3 fillCatagoriesSpinner();
4
5 Cursor itemCursor = Item.find(mDb, mDbItemId);
6 startManagingCursor(itemCursor);
7
8 mItemNameField.setText(itemCursor.getString(itemCursor.getColumnIndexOrThrow(Item.NAME)));
9 mItemAmountField.setText(itemCursor.getString(itemCursor.getColumnIndexOrThrow(Item.AMOUNT)));
10
11 long catagory_id = itemCursor.getInt(itemCursor.getColumnIndexOrThrow(Item.CATAGORY_ID));
12 for (int i = 0; i < mCatagoriesSpinner.getCount(); i++) {
13 Cursor value = (Cursor) mCatagoriesSpinner.getItemAtPosition(i);
14 if (value.getLong(value.getColumnIndex("_id")) == catagory_id) {
15 mCatagoriesSpinner.setSelection(i);
16 }
17 }
18 }
19 }
20
21 private void fillCatagoriesSpinner() {
22 Cursor catagoriesCursor = Category.findAll(mDb);
23
24 startManagingCursor(catagoriesCursor);
25
26 mCatagoriesSpinner.setAdapter(new SimpleCursorAdapter(this,
27 android.R.layout.simple_spinner_item,
28 catagoriesCursor,
29 new String[]{Category.NAME},
30 new int[]{android.R.id.text1}));
31 }

Danke

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

30.11.2010, 19:14:11 via Website

Ja gerne.

Im Prinzig mußt Du wenn ich das richtig sehe nur den "Bequem-Query" durch einen rawQuery ersetzen Statt:

1Cursor category_cursor = db.query(Category.TABLE_NAME, new String[]{Category.ID, Category.NAME}, null, null, null, null, null);
2return category_cursor;

Mach das:

1Cursor category_cursor = db.rawQuery(
2"select 0, '--- Neue Kategorie ---'" +
3" union all " +
4" select " + Category.ID + "," + Category.NAME + " from " + Category.TABLE_NAME,
5 null);
6return category_cursor;

Auf der Konsole geht dieser UNION ALL ohne Probleme. Ich hoffe das das auch über die rawQuery Methode geht. Ich habe das einfach runtergetippt - die Tippfehler kannt Du gerne behalten ...

Gruß
Harald

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

01.12.2010, 09:49:24 via Website

Hallo,

wenn ich das so einbaue bekomme ich diese Error in Logcat!

109:47:12.554 327 ERROR AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{de.android.shoppinglist/de.android.shoppinglist.EditItem}: java.lang.IllegalArgumentException: column '_id' does not exist

an was kann das liegen?

Mfg

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

01.12.2010, 10:27:06 via Website

hallo,

hast du eine Spalte die "_id" heißt? So eine musst du nämlich haben.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

01.12.2010, 10:47:55 via Website

Sebastian Klaiber
Hallo,

wenn ich das so einbaue bekomme ich diese Error in Logcat!

109:47:12.554 327 ERROR AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{de.android.shoppinglist/de.android.shoppinglist.EditItem}: java.lang.IllegalArgumentException: column '_id' does not exist

an was kann das liegen?
Mfg

Ich unterstelle mal das Category.ID den Text "_id" enthält sonst bekommst Du ja ohnehin irgendwann mal leichte Probleme. Ansonsten ist es mein Fehler - die Spalten sind nicht "benamst". Sorry.:

Versuch mal Folgendes:

1"select 0 as " + Category.ID + ", '--- Neue Kategorie ---' as " + Category.TABLE_NAME +
2" union all " +
3" select " + Category.ID + "," + Category.NAME + " from " + Category.TABLE_NAME,
4null);

Gruß
Harald

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

01.12.2010, 11:57:43 via Website

Genau, entweder "as" verwenden, oder den konstanten Teil nach hinten verlegen, also
1select _id, name from category
2union select 0, 'Neu'

Antworten
Sebastian Klaiber
  • Forum-Beiträge: 44

01.12.2010, 12:22:09 via Website

Hi, nun funktioniert es wunderbar! Danke für deine Hilfe!

Antworten