問題は、スピナーが選択した位置(0、1、2など)を行のIDとして使用していることです。最初の行IDは1、次に2などになります( おそらく、しかし確実ではありません。つまり、何らかの理由で行を削除し、シーケンスにギャップがあります 。
そのため、現在発生しているのは、行IDとスピナー位置の差が1であるため、何も更新されていないか、別の行が更新されています。
行IDをスピナー位置に変換する何らかの方法を使用する必要があります(たとえば、最初の配列の同じインデックスのそれぞれのIDを持つ2番目の配列)、または、私が行うことは、 CursorAdpater
の柔軟性 、SimpleCursorAdapter
など 次に、spinner.getSelectedItemId()
を使用します spinner.getSelectedItemPosition()
の代わりに 。
CursorAdapterを使用するには、 _idという行が必要です。 (例:private static final String KEY_ID = "id";
を変更します to public static final String KEY_ID = "_id";
)
ノート!また、上記のように、private statics
を変更することをお勧めします。 public statics
。
また、CursorAdapterを使用するには、カーソルが必要です。 SpinnerDatabase.javaの次のメソッドで十分です。
public Cursor getAll() {
db = this.getWritableDatabase();
return db.query(TABLE_LABELS,null,null,null,null,null,null);
}
以下を使用して、アダプターをセットアップできます。-
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);
ノート! SpinnerDatabase.KEY_NAME
の使用 、これは、private static
ではなく'publicstatic'を提案する理由の例です。 。
SimpleCursorAdpaterには微妙な違いがあります;
- 3番目 paramterはカーソルです
- 4番目 表示されるカーソル内の列名の文字列配列です(5番目のパラメータと一致する必要があります)。
- 5日 データが配置されるビューのIDです(simple_list_item_1の場合は、上記のandroid.R.id.text1とともに1つの列名を使用します) 。
更新に関しては、 spinner.getSelectedItemId()
を使用してください 行ID。
実例(行にデータがあると想定)
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);
}
}
アクティビティ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());
}
}
});
}
}
レイアウト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>
使用例:-
スピナーが選択されました(更新データが既に入力されていることに注意してください ):-
ピーナッツバターが選択され、更新されたデータが入力されました:-
[編集]ボタンをクリックした後:-
現在選択されているスピナーアイテムへのEditTextの設定
以下を使用して、EditTextを現在選択されているスピナーアイテムの値に設定できます。-
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) {
}
});
アクティビティでアダプタを設定した後に追加できます。
上記のSO46330096Activity.java 次の行に従うことができます:-
spinner.setAdapter(sca);