You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite数据加载至Spinner需重启应用才显示的问题求助

问题解决:Spinner数据需重启才显示的修复方案

问题根源

你的代码存在两个核心问题导致Spinner无法实时刷新:

  1. 数据更新后未通知适配器数据集变化,适配器无法感知数据更新,UI不会同步刷新
  2. 重复创建并设置适配器,不仅冗余,也未利用适配器的原生刷新机制

修复步骤及代码示例

1. 将适配器定义为类成员变量

避免每次加载数据都重新创建适配器,复用同一个实例才能实现数据刷新:

private lateinit var mainAdapter: ArrayAdapter<String>
private val mainList = mutableListOf<String>()

2. 在初始化阶段(如onCreate)配置适配器

仅需设置一次适配器,后续仅更新数据并通知刷新:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // ...其他初始化代码
    // 初始化适配器并绑定到Spinner
    mainAdapter = ArrayAdapter(this, R.layout.user_sprsytyle, mainList)
    mainAdapter.setDropDownViewResource(R.layout.user_sprsytyle)
    layoutBnd.loginSprMain.adapter = mainAdapter
    // 首次加载数据库数据
    loadDataFromDB()
}

3. 优化数据加载方法并添加刷新通知

数据加载完成后,调用notifyDataSetChanged()通知适配器更新UI:

private fun loadDataFromDB() {
    mainList.clear()
    // 使用use函数自动关闭数据库和Cursor,避免资源泄漏
    openOrCreateDatabase("Park", Context.MODE_PRIVATE, null).use { database ->
        database.rawQuery("SELECT * FROM BT_Main", null).use { cursor ->
            val mainNameIndex = cursor.getColumnIndex("MainName")
            while (cursor.moveToNext()) {
                mainList.add(cursor.getString(mainNameIndex))
            }
        }
    }
    // 关键:通知适配器数据已更新,触发Spinner实时刷新
    mainAdapter.notifyDataSetChanged()
}

4. 数据变更后调用加载方法

当你通过操作修改了数据库中的BT_Main表数据后,直接调用loadDataFromDB()即可实时刷新Spinner,无需重启应用。


内容的提问来源于stack exchange,提问作者Eyüp Ateş

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:36:19