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

如何在Kotlin中实现从其他Activity获取数据的Spinner

Kotlin实现Spinner从其他Activity获取数据并更新列表的方案

核心问题分析

你之前每次进入Activity都重新创建列表,本质是没有复用已有的数据集合,每次初始化新列表导致旧数据丢失。下面提供两种实用方案,解决数据共享和列表更新的问题。


方案一:使用ViewModel共享数据(推荐,适合长期数据维护)

ViewModel可以在Activity生命周期内持久保存数据,不会因Activity重建(比如横竖屏切换)丢失,也能实现多Activity间的数据共享。

  1. 创建共享ViewModel
import androidx.lifecycle.ViewModel

class SharedSpinnerViewModel : ViewModel() {
    // 维护Spinner的数据源列表,全局复用
    val spinnerDataList = mutableListOf<String>()
}
  1. 在数据源Activity中更新数据
import androidx.activity.viewModels

class DataSourceActivity : AppCompatActivity() {
    // 获取共享ViewModel
    private val sharedViewModel: SharedSpinnerViewModel by viewModels({ requireActivity() })

    // 示例:添加新数据到共享列表
    fun addNewDataToSpinner(newItem: String) {
        // 可选:避免重复添加相同数据
        if (!sharedViewModel.spinnerDataList.contains(newItem)) {
            sharedViewModel.spinnerDataList.add(newItem)
        }
        // 批量更新的话直接追加:sharedViewModel.spinnerDataList.addAll(batchItems)
    }
}
  1. 在Spinner所在Activity中初始化并更新
import androidx.activity.viewModels
import android.widget.ArrayAdapter
import android.widget.Spinner

class SpinnerActivity : AppCompatActivity() {
    private val sharedViewModel: SharedSpinnerViewModel by viewModels({ requireActivity() })
    private lateinit var spinner: Spinner
    private lateinit var adapter: ArrayAdapter<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_spinner)

        spinner = findViewById(R.id.your_spinner_id)
        // 初始化适配器,绑定共享列表作为数据源
        adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, sharedViewModel.spinnerDataList)
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        spinner.adapter = adapter
    }

    override fun onResume() {
        super.onResume()
        // 每次回到该Activity时,通知适配器数据已更新
        adapter.notifyDataSetChanged()
    }
}

方案二:使用Intent返回数据(适合一次性传递数据)

如果只是需要从数据源Activity一次性带回数据,用startActivityForResult更直接。

  1. Spinner所在Activity启动数据源Activity并接收结果
import android.content.Intent
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.Spinner

class SpinnerActivity : AppCompatActivity() {
    private lateinit var spinner: Spinner
    private lateinit var adapter: ArrayAdapter<String>
    // 本地维护列表,避免每次创建新列表
    private val spinnerDataList = mutableListOf<String>()
    private val DATA_REQUEST_CODE = 1001

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_spinner)

        spinner = findViewById(R.id.your_spinner_id)
        adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, spinnerDataList)
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        spinner.adapter = adapter

        // 启动数据源Activity的按钮示例
        findViewById<Button>(R.id.btn_open_data_source).setOnClickListener {
            val intent = Intent(this, DataSourceActivity::class.java)
            startActivityForResult(intent, DATA_REQUEST_CODE)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == DATA_REQUEST_CODE && resultCode == RESULT_OK) {
            // 获取返回的单条数据
            val newItem = data?.getStringExtra("SPINNER_NEW_ITEM")
            newItem?.let {
                if (!spinnerDataList.contains(it)) {
                    spinnerDataList.add(it)
                    // 通知适配器刷新列表
                    adapter.notifyDataSetChanged()
                }
            }
            // 批量数据返回示例:
            // val batchItems = data?.getStringArrayListExtra("SPINNER_BATCH_ITEMS")
            // batchItems?.let { spinnerDataList.addAll(it); adapter.notifyDataSetChanged() }
        }
    }
}
  1. 数据源Activity返回数据
import android.content.Intent

class DataSourceActivity : AppCompatActivity() {
    // 示例:获取数据后返回给Spinner所在Activity
    fun sendDataBack() {
        val newData = "新增的选项内容" // 替换为实际获取的数据
        val resultIntent = Intent()
        resultIntent.putExtra("SPINNER_NEW_ITEM", newData)
        // 批量数据返回:resultIntent.putStringArrayListExtra("SPINNER_BATCH_ITEMS", ArrayList(batchDataList))
        setResult(RESULT_OK, resultIntent)
        finish()
    }
}

内容的提问来源于stack exchange,提问作者Vandi Angelo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:55:30