我如何使用 EditText 中的用户输入更新微调器的字段
How can i update a field of my spinner with user input in EditText
我有一个正在填充我的 Spinner 的 SQLite 数据库。
"add" 功能运行良好!我想做的是当用户点击微调项时,他可以更改以下字段并在数据库中更新
我的 Spinner 数据库
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";
private 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);
db.close();
}
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();
db.close();
return labels;
}
public void updateSpinner (int 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();
}
}
问题是当我点击更新按钮时,它没有任何反应!并更新另一项(如果我有更多项)。
这是我的片段中列出所有条目的方法:
private void loadSpinnerData (){
SpinnerDatabase db = new SpinnerDatabase(getActivity().getApplicationContext());
List<String> labels = db.getAllLabels();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),
android.R.layout.simple_spinner_item,labels);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
这里是我正在尝试进行更新的保存按钮:
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = editText.getText().toString();
if(name.length()>0 && name != null){
int spinnerValue = spinner.getSelectedItemPosition();
SpinnerDatabase db = new SpinnerDatabase(getActivity().getApplicationContext());
db.updateSpinner(spinnerValue,name);
}
});
您的问题是,您正在使用微调器的选定位置(0、1、2 等)作为行的 ID。第一行 id 将是 1,然后是 2,依此类推(可能但不确定,即由于某种原因删除一行并且序列中有间隙).
因此,您当前遇到的情况是行 ID 和微调器位置之间的差异为 1,因此要么没有更新,要么更新了另一行。
您要么需要采用某种方法来计算微调器位置的行 ID(例如,第二个数组具有与第一个数组相同索引的相应 ID),或者我要做的是,利用 CursorAdpater
的灵活性,例如 SimpleCursorAdapter
,然后使用 spinner.getSelectedItemId()
而不是 spinner.getSelectedItemPosition()
。
要使用 CursorAdapter,您需要一个名为 _id 的行(例如,将 private static final String KEY_ID = "id";
更改为 public static final String KEY_ID = "_id";
)
注意!我还建议将您的 private statics
更改为 public statics
)。
另外,要使用 CursorAdapter,您还需要一个 Cursor。 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
,这就是为什么我建议使用 'public static' 而不是 private static
的一个例子。
SimpleCursorAdpater 存在细微差别;
- 3rd参数为Cursor,
- 4th是游标中要显示的列名的String数组(要匹配第5个参数),
- 5th 是放置数据的视图的 ID (对于 simple_list_item_1 使用 1 列名称和 [=120= .text1 如上).
并且在更新时使用 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);
}
}
ActivitySO46330096Activity.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 设置为当前选择的 Spinner Item
以下可用于将 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) {
}
});
可以在Activity中设置Adapter后添加。
在上面SO46330096Activity.java它可以遵循以下行:-
spinner.setAdapter(sca);
我有一个正在填充我的 Spinner 的 SQLite 数据库。 "add" 功能运行良好!我想做的是当用户点击微调项时,他可以更改以下字段并在数据库中更新
我的 Spinner 数据库
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";
private 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);
db.close();
}
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();
db.close();
return labels;
}
public void updateSpinner (int 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();
}
}
问题是当我点击更新按钮时,它没有任何反应!并更新另一项(如果我有更多项)。 这是我的片段中列出所有条目的方法:
private void loadSpinnerData (){
SpinnerDatabase db = new SpinnerDatabase(getActivity().getApplicationContext());
List<String> labels = db.getAllLabels();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),
android.R.layout.simple_spinner_item,labels);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
这里是我正在尝试进行更新的保存按钮:
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = editText.getText().toString();
if(name.length()>0 && name != null){
int spinnerValue = spinner.getSelectedItemPosition();
SpinnerDatabase db = new SpinnerDatabase(getActivity().getApplicationContext());
db.updateSpinner(spinnerValue,name);
}
});
您的问题是,您正在使用微调器的选定位置(0、1、2 等)作为行的 ID。第一行 id 将是 1,然后是 2,依此类推(可能但不确定,即由于某种原因删除一行并且序列中有间隙).
因此,您当前遇到的情况是行 ID 和微调器位置之间的差异为 1,因此要么没有更新,要么更新了另一行。
您要么需要采用某种方法来计算微调器位置的行 ID(例如,第二个数组具有与第一个数组相同索引的相应 ID),或者我要做的是,利用 CursorAdpater
的灵活性,例如 SimpleCursorAdapter
,然后使用 spinner.getSelectedItemId()
而不是 spinner.getSelectedItemPosition()
。
要使用 CursorAdapter,您需要一个名为 _id 的行(例如,将 private static final String KEY_ID = "id";
更改为 public static final String KEY_ID = "_id";
)
注意!我还建议将您的 private statics
更改为 public statics
)。
另外,要使用 CursorAdapter,您还需要一个 Cursor。 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
,这就是为什么我建议使用 'public static' 而不是 private static
的一个例子。
SimpleCursorAdpater 存在细微差别;
- 3rd参数为Cursor,
- 4th是游标中要显示的列名的String数组(要匹配第5个参数),
- 5th 是放置数据的视图的 ID (对于 simple_list_item_1 使用 1 列名称和 [=120= .text1 如上).
并且在更新时使用 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);
}
}
ActivitySO46330096Activity.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 设置为当前选择的 Spinner Item
以下可用于将 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) {
}
});
可以在Activity中设置Adapter后添加。
在上面SO46330096Activity.java它可以遵循以下行:-
spinner.setAdapter(sca);