Ditt problem är att du använder spinnarens valda position (0,1,2 etc) som radens id. Det första rad-id:t kommer att vara 1, sedan 2, etc (förmodligen men INTE VISST, dvs. radera en rad av någon anledning och du har en lucka i sekvensen ).
Som sådan är vad du för närvarande upplever en skillnad på 1 mellan rad-id och spinnerposition, så antingen uppdateras ingenting eller en annan rad.
Du måste antingen använda någon metod för att räkna ut rad-id till spinnerposition (t.ex. en andra array som har respektive id för samma index som den första arrayen), eller för att, vad jag skulle göra är, dra fördel av flexibiliteten för en CursorAdpater
, till exempel SimpleCursorAdapter
och använd sedan spinner.getSelectedItemId()
istället för spinner.getSelectedItemPosition()
.
För att använda en marköradapter behöver du en rad som heter _id (t.ex. ändra private static final String KEY_ID = "id";
till public static final String KEY_ID = "_id";
)
Notera! Jag skulle också föreslå att du ändrar, som jag har ovan, din private statics
till public statics
).
För att använda en CursorAdapter behöver du också en Cursor. Följande metod i SpinnerDatabase.java skulle räcka.
public Cursor getAll() {
db = this.getWritableDatabase();
return db.query(TABLE_LABELS,null,null,null,null,null,null);
}
Följande kan användas för att ställa in adaptern:-
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);
Notera! användningen av SpinnerDatabase.KEY_NAME
, detta är ett exempel på varför jag föreslår "public static" i motsats till private static
.
Det finns subtila skillnader för SimpleCursorAdpater;
- tredje parameter är markören,
- 4:e är en strängmatris av kolumnnamnen i markören som ska visas (ska matcha den femte parametern),
- 5:e är id:n för vyerna som data placeras i (för simple_list_item_1 använd ett kolumnnamn tillsammans med android.R.id.text1 enligt ovan) .
och när det kommer till uppdateringen använd spinner.getSelectedItemId()
för rad-id.
Arbetsexempel (förutsätter att rader har data)
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);
}
}
Aktivitet 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());
}
}
});
}
}
Layouten 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>
Exempel på användning:-
Spinner vald (observera att uppdateringsdata redan har angetts ):-
Jordnötssmör valts och uppdaterad data angavs :-
Efter att ha klickat på knappen Redigera :-
Ställa in EditText till det för närvarande valda spinnerobjektet
Följande kan användas för att ställa in EditText till värdet för det för närvarande valda spinnerobjektet:-
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) {
}
});
Den kan läggas till efter att du har ställt in adaptern i aktiviteten.
I ovanståendeSO46330096Activity.java det kan följa linjen :-
spinner.setAdapter(sca);