Ihr Problem ist, dass Sie die ausgewählte Position des Spinners (0,1,2 usw.) als ID der Zeile verwenden. Die erste Zeilen-ID ist 1, dann 2 usw. (wahrscheinlich, aber NICHT SICHER, d. h. aus irgendeinem Grund eine Zeile löschen und Sie haben eine Lücke in der Sequenz ).
Daher erleben Sie derzeit einen Unterschied von 1 zwischen Zeilen-ID und Spinner-Position, sodass entweder nichts oder eine andere Zeile aktualisiert wird.
Sie müssen entweder eine Methode anwenden, um die Zeilen-ID zur Spinner-Position zu ermitteln (z. B. ein zweites Array, das die entsprechende ID für denselben Index des ersten Arrays hat), oder, was ich tun würde, nutzen Sie die Flexibilität eines CursorAdpater
, wie z. B. SimpleCursorAdapter
und verwenden Sie dann spinner.getSelectedItemId()
anstelle von spinner.getSelectedItemPosition()
.
Um einen CursorAdapter zu verwenden, benötigen Sie eine Zeile namens _id (z. B. ändern private static final String KEY_ID = "id";
zu public static final String KEY_ID = "_id";
)
Notiz! Ich würde auch vorschlagen, wie oben beschrieben, Ihre private statics
zu ändern zu public statics
).
Um einen CursorAdapter zu verwenden, benötigen Sie außerdem einen Cursor. Die folgende Methode in SpinnerDatabase.java würde ausreichen.
public Cursor getAll() {
db = this.getWritableDatabase();
return db.query(TABLE_LABELS,null,null,null,null,null,null);
}
Folgendes könnte verwendet werden, um den Adapter einzurichten:-
csr = dbhlpr.getAll();
sca = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
csr,
new String[]{SpinnerDatabase.KEY_NAME},
new int[]{android.R.id.text1},0);
spinner.setAdapter(sca);
Notiz! die Verwendung von SpinnerDatabase.KEY_NAME
, dies ist ein Beispiel dafür, warum ich "öffentliche statische" anstelle von private static
vorschlage .
Es gibt subtile Unterschiede für den SimpleCursorAdpater;
- 3. Parameter ist der Cursor,
- 4. ist ein String-Array der Spaltennamen im Cursor, die angezeigt werden sollen (sollte mit dem 5. Parameter übereinstimmen),
- 5. ist die IDs der Ansichten, in denen die Daten platziert werden (für simple_list_item_1 verwenden Sie 1 Spaltennamen zusammen mit android.R.id.text1 wie oben) .
und wenn es um das Update geht, verwenden Sie spinner.getSelectedItemId()
für die Zeilen-ID.
Arbeitsbeispiel (setzt voraus, dass Zeilen Daten enthalten)
SpinnerDatabase.java
public class SpinnerDatabase extends SQLiteOpenHelper {
private SQLiteDatabase db;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "spinnerDB";
private static final String TABLE_LABELS = "labels";
private static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public SpinnerDatabase(Context context) {
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CATEGORIES_TABLES = "CREATE TABLE " +
TABLE_LABELS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+
KEY_NAME + " TEXT)";
db.execSQL(CREATE_CATEGORIES_TABLES);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);
onCreate(db);
}
public void insertLabel(String label){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME,label);
db.insert(TABLE_LABELS,null,values);
}
//Defunct
public List<String> getAllLabels(){
List<String> labels = new ArrayList<String>();
String selectQuery = "SELECT * FROM "+ TABLE_LABELS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery,null);
if (cursor.moveToFirst()){
do{
labels.add(cursor.getString(1));
}while (cursor.moveToNext());
}
cursor.close();
return labels;
}
public void updateSpinner (long id, String label){
ContentValues values;
String where;
db = this.getWritableDatabase();
where = KEY_ID + " = " +id;
values = new ContentValues();
values.put(KEY_NAME,label);
db.update(TABLE_LABELS,values,where,null);
db.close();
}
public Cursor getAll() {
db = this.getWritableDatabase();
return db.query(TABLE_LABELS,null,null,null,null,null,null);
}
}
Aktivität SO46330096Activity.java
public class SO46330096Activity extends AppCompatActivity {
SpinnerDatabase dbhlpr;
Spinner spinner;
Button editbutton;
EditText spinneritem;
SimpleCursorAdapter sca;
Cursor csr;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_so46330096);
spinner = (Spinner) findViewById(R.id.spinner);
editbutton = (Button) findViewById(R.id.editbutton);
spinneritem = (EditText) findViewById(R.id.spinnerinput);
dbhlpr = new SpinnerDatabase(this);
csr = dbhlpr.getAll();
sca = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
csr,
new String[]{SpinnerDatabase.KEY_NAME},
new int[]{android.R.id.text1},0);
spinner.setAdapter(sca);
editbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (spinneritem.getText().toString().length() > 0) {
dbhlpr.updateSpinner(spinner.getSelectedItemId(),spinneritem.getText().toString());
sca.swapCursor(csr = dbhlpr.getAll());
}
}
});
}
}
Das Layout activity_so46330096.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SO463300096 Activity"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="SPINNER ENTRY"
/>
<EditText
android:id="@+id/spinnerinput"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="match_parent" />
<Button
android:id="@+id/editbutton"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="EDIT"/>
</LinearLayout>
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Spinner>
</LinearLayout>
Beispielverwendung:-
Spinner ausgewählt (Beachten Sie, dass Aktualisierungsdaten bereits eingegeben wurden ):-
Erdnussbutter ausgewählt und aktualisierte Daten eingegeben:-
Nach dem Klicken auf die Schaltfläche Bearbeiten :-
EditText auf das aktuell ausgewählte Spinner-Element setzen
Folgendes kann verwendet werden, um den EditText auf den Wert des aktuell ausgewählten Spinner-Elements zu setzen:-
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
spinneritem.setText(csr.getString(csr.getColumnIndex(SpinnerDatabase.KEY_NAME)));
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
Sie können hinzugefügt werden, nachdem Sie den Adapter in der Aktivität festgelegt haben.
In der obigen SO46330096Activity.java es könnte der Zeile folgen:-
spinner.setAdapter(sca);