Dit problem er, at du bruger Spinnerens valgte position (0,1,2 osv.) som rækkens id. Det første række-id vil være 1, derefter 2 osv. (sandsynligvis, men IKKE SIKKERT, dvs. slet en række af en eller anden grund, og du har et hul i rækkefølgen ).
Som sådan er det, du oplever i øjeblikket, en forskel på 1 mellem række-id og spinnerposition, så enten intet eller en anden række bliver opdateret.
Du skal enten bruge en eller anden metode til at beregne række-id'et til spinner-position (f.eks. et andet array, der har det respektive id for det samme indeks for det første array), eller hvad jeg ville gøre er at drage fordel af fleksibilitet af en CursorAdpater
, såsom SimpleCursorAdapter
og brug derefter spinner.getSelectedItemId()
i stedet for spinner.getSelectedItemPosition()
.
For at bruge A CursorAdapter skal du bruge en række kaldet _id (f.eks. ændre private static final String KEY_ID = "id";
til public static final String KEY_ID = "_id";
)
Bemærk! Jeg vil også foreslå at ændre din private statics
, som jeg har ovenfor til public statics
).
For at bruge en CursorAdapter skal du også bruge en Cursor. Følgende metode i SpinnerDatabase.java ville være tilstrækkelig.
public Cursor getAll() {
db = this.getWritableDatabase();
return db.query(TABLE_LABELS,null,null,null,null,null,null);
}
Følgende kan bruges til at konfigurere adapteren:-
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);
Bemærk! brugen af SpinnerDatabase.KEY_NAME
, dette er et eksempel på, hvorfor jeg foreslår 'offentlig statisk' i modsætning til private static
.
Der er sublte forskelle for SimpleCursorAdpater;
- 3. parameter er markøren,
- 4. er en streng-array af kolonnenavnene i markøren, der skal vises (skal matche 5. parameter),
- 5. er id'erne for de visninger, som dataene er placeret i (til simple_list_item_1 brug 1 kolonnenavn sammen med android.R.id.text1 som ovenfor) .
og når det kommer til opdateringen, brug spinner.getSelectedItemId()
for række-id.
Arbejdseksempel (antager, at rækker 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());
}
}
});
}
}
Layoutet 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>
Eksempel på brug:-
Spinner valgt (bemærk, at opdateringsdata allerede er indtastet ):-
Peanut Butter valgt og opdaterede data indtastet :-
Efter at have klikket på knappen Rediger :-
Indstilling af EditText til det aktuelt valgte spinneremne
Følgende kan bruges til at indstille EditText til værdien af det aktuelt valgte spinneremne:-
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 kunne tilføjes efter indstilling af adapteren i aktiviteten.
I ovenståendeSO46330096Activity.java det kunne følge linjen :-
spinner.setAdapter(sca);