Vấn đề của bạn là bạn đang sử dụng vị trí đã chọn của Spinner (0,1,2, v.v.) làm id của hàng. Id hàng đầu tiên sẽ là 1, sau đó là 2, v.v. ( có thể nhưng KHÔNG CHỨNG MINH, tức là xóa một hàng vì lý do nào đó và bạn có khoảng trống trong dãy ).
Do đó những gì bạn đang gặp phải là sự khác biệt 1 giữa id hàng và vị trí cột xoay, vì vậy không có gì hoặc hàng khác đang được cập nhật.
Bạn cần phải sử dụng một số phương pháp tính toán id hàng đến vị trí spinner (ví dụ:mảng thứ hai có id tương ứng cho cùng một chỉ mục của mảng đầu tiên), hoặc điều tôi muốn làm là, hãy tận dụng lợi thế của tính linh hoạt của CursorAdpater
, chẳng hạn như SimpleCursorAdapter
và sau đó sử dụng spinner.getSelectedItemId()
thay vì spinner.getSelectedItemPosition()
.
Để sử dụng A CursorAdapter, bạn sẽ cần một hàng có tên _id (ví dụ:thay đổi private static final String KEY_ID = "id";
thành public static final String KEY_ID = "_id";
)
Ghi chú! Tôi cũng khuyên bạn nên thay đổi, như tôi đã nói ở trên, private statics
của bạn thành public statics
).
Ngoài ra, để sử dụng CursorAdapter, bạn sẽ cần một Cursor. Phương thức sau trong SpinnerDatabase.java là đủ.
public Cursor getAll() {
db = this.getWritableDatabase();
return db.query(TABLE_LABELS,null,null,null,null,null,null);
}
Những điều sau có thể được sử dụng để thiết lập adpater:-
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);
Ghi chú! việc sử dụng SpinnerDatabase.KEY_NAME
, đây là một ví dụ về lý do tại sao tôi đề xuất 'public static' thay vì private static
.
Có sự khác biệt nhỏ đối với SimpleCursorAdpater;
- Thứ 3 tham số là Con trỏ,
- Thứ 4 là một mảng Chuỗi gồm các tên cột trong con trỏ sẽ được hiển thị (phải khớp với tham số thứ 5),
- Thứ 5 là id của các chế độ xem mà dữ liệu được đặt vào đó (đối với simple_list_item_1, hãy sử dụng 1 tên cột cùng với android.R.id.text1 như trên) .
và khi cập nhật, hãy sử dụng spinner.getSelectedItemId()
cho id hàng.
Ví dụ làm việc (giả sử các hàng có dữ liệu)
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);
}
}
Hoạt động 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());
}
}
});
}
}
Bố cục 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>
Cách sử dụng ví dụ:-
Spinner được chọn ( dữ liệu cập nhật ghi chú đã được nhập ):-
Đã chọn Bơ đậu phộng và Đã nhập dữ liệu cập nhật:-
Sau khi nhấp vào nút Chỉnh sửa:-
Đặt EditText thành Mục Spinner hiện được chọn
Phần sau có thể được sử dụng để đặt EditText thành giá trị của mục spinner hiện được chọn:-
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) {
}
});
Có thể được thêm vào sau khi đặt Bộ điều hợp trong Hoạt động.
Trong SO46330096Activity.java ở trên nó có thể theo dòng:-
spinner.setAdapter(sca);