Twój problem polega na tym, że używasz wybranej pozycji Spinnera (0,1,2 itd.) jako identyfikatora wiersza. Identyfikatorem pierwszego wiersza będzie 1, potem 2 itd. (prawdopodobnie, ale NIE NA PEWNO, tzn. usuń wiersz z jakiegoś powodu, a masz przerwę w sekwencji ).
W związku z tym to, czego obecnie doświadczasz, to różnica 1 między identyfikatorem wiersza a pozycją pokrętła, więc albo nic nie jest aktualizowane, albo inny wiersz.
Musisz albo zastosować jakąś metodę obliczenia identyfikatora wiersza do pozycji pokrętła (np. druga tablica, która ma odpowiedni identyfikator dla tego samego indeksu pierwszej tablicy), albo skorzystać z elastyczność CursorAdpater
, na przykład SimpleCursorAdapter
a następnie użyj spinner.getSelectedItemId()
zamiast spinner.getSelectedItemPosition()
.
Aby użyć adaptera kursora, potrzebujesz wiersza o nazwie _id (np. zmień private static final String KEY_ID = "id";
do public static final String KEY_ID = "_id";
)
Notatka! Proponuję również zmienić, tak jak powyżej, swoje private statics
do public statics
).
Również aby użyć CursorAdapter, będziesz potrzebować Cursor. Poniższa metoda w SpinnerDatabase.java wystarczy.
public Cursor getAll() {
db = this.getWritableDatabase();
return db.query(TABLE_LABELS,null,null,null,null,null,null);
}
Do konfiguracji adaptera można wykorzystać następujące elementy:-
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);
Notatka! użycie SpinnerDatabase.KEY_NAME
, jest to przykład tego, dlaczego proponuję „statyczne publiczne” w przeciwieństwie do private static
.
Istnieją niewielkie różnice w przypadku SimpleCursorAdpater;
- Trzeci parametrem jest Kursor,
- Czwarty jest tablicą ciągów nazw kolumn w kursorze do wyświetlenia (powinien pasować do 5. parametru),
- piąty to identyfikatory widoków, w których umieszczane są dane (dla simple_list_item_1 użyj 1 nazwy kolumny wraz z android.R.id.text1 jak powyżej) .
a jeśli chodzi o aktualizację, użyj spinner.getSelectedItemId()
dla identyfikatora wiersza.
Przykład roboczy (przy założeniu, że wiersze zawierają dane)
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);
}
}
Aktywność 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());
}
}
});
}
}
Układ 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>
Przykładowe użycie:-
Wybrano spinner (uwaga dane aktualizacji zostały już wprowadzone ):-
Wybrano masło orzechowe i wprowadzono zaktualizowane dane :-
Po kliknięciu przycisku Edytuj :-
Ustawianie EditText na aktualnie wybrany element Spinnera
Poniższe mogą być użyte do ustawienia EditText na wartość aktualnie wybranego elementu spinnera:-
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) {
}
});
Można dodać po ustawieniu adaptera w działaniu.
W powyższymSO46330096Activity.java może podążać za linią :-
spinner.setAdapter(sca);