Android如何实现从SQLite数据库实时加载Spinner下拉选项数据
Spinner实时更新解决方案
问题根因
你的Spinner数据源仅在Activity初始化onCreate阶段加载一次,向数据库新增分组后,没有主动更新Spinner绑定的数据源、通知适配器数据变更,因此界面不会自动刷新。
具体修改步骤
- 将Spinner适配器、数据源、数据库Helper提取为Activity的全局成员变量,方便后续调用
- 新增数据插入成功后,主动刷新Spinner的数据源并通知适配器更新
- 补充Cursor关闭逻辑,避免内存泄漏
修改后的完整代码
优化MyDatabaseHelper(可选,更严谨)
修改addGroup方法返回布尔值标识插入是否成功,避免插入失败时无效刷新:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String GROUP_TABLE_NAME = "Groups"; private static final String GROUP_ID = "_id"; private static final String GROUP_TITLE = "group_title"; // 修改返回值为boolean boolean addGroup(String title) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(GROUP_TITLE, title); long result = db.insert(GROUP_TABLE_NAME, null, cv); if (result == -1) { Toast.makeText(context, "Failed", Toast.LENGTH_SHORT).show(); return false; } else { Toast.makeText(context, "Added successfully!", Toast.LENGTH_SHORT).show(); return true; } } Cursor readAllGroups() { String query = "SELECT * FROM " + GROUP_TABLE_NAME; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = null; if (db != null) { cursor = db.rawQuery(query, null); } return cursor; } }
修改GoodsAdd Activity
public class GoodsAdd extends AppCompatActivity implements AdapterView.OnItemSelectedListener { // 提取为全局成员变量 private ArrayList<String> groups; private ArrayAdapter<String> spinnerAdapter; private MyDatabaseHelper myDB; private Spinner spinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.goods_add); // 提前初始化全局变量 myDB = new MyDatabaseHelper(GoodsAdd.this); spinner = findViewById(R.id.group_spinner); spinner.setOnItemSelectedListener(this); makeSpinner(); } private void makeSpinner() { groups = new ArrayList<>(); Cursor cursor = myDB.readAllGroups(); if (cursor.getCount() != 0) { while (cursor.moveToNext()) { groups.add(cursor.getString(1)); } } // 用完Cursor必须关闭,避免内存泄漏 cursor.close(); spinnerAdapter = new ArrayAdapter(this, R.layout.spinner_item, groups); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(spinnerAdapter); } // 新增数据刷新方法 private void refreshSpinner() { groups.clear(); Cursor cursor = myDB.readAllGroups(); if (cursor.getCount() != 0) { while (cursor.moveToNext()) { groups.add(cursor.getString(1)); } } cursor.close(); // 通知适配器数据变更,自动刷新界面 spinnerAdapter.notifyDataSetChanged(); } public void addGroup(View view) { AlertDialog.Builder alert = new AlertDialog.Builder(this); final EditText edittext = new EditText(this); edittext.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); alert.setMessage("new group name:"); alert.setView(edittext); alert.setPositiveButton("submit", (dialog, whichButton) -> { String title = edittext.getText().toString().trim(); boolean addSuccess = myDB.addGroup(title); Toast.makeText(GoodsAdd.this, title + " !!!!!", Toast.LENGTH_SHORT).show(); // 插入成功再刷新数据 if (addSuccess) { refreshSpinner(); } }); alert.show(); } @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {} @Override public void onNothingSelected(AdapterView<?> adapterView) {} }
更高效的可选方案
如果不需要重新全量查询数据库,也可以在确认插入成功后,直接把新增的标题添加到数据源中,再通知适配器更新,性能更好:
alert.setPositiveButton("submit", (dialog, whichButton) -> { String title = edittext.getText().toString().trim(); boolean addSuccess = myDB.addGroup(title); Toast.makeText(GoodsAdd.this, title + " !!!!!", Toast.LENGTH_SHORT).show(); if (addSuccess) { // 直接添加到数据源,无需重新查询 groups.add(title); spinnerAdapter.notifyDataSetChanged(); } });
内容的提问来源于stack exchange,提问作者Pouria
相关产品推荐
相关产品推荐

