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

Kotlin如何提取嵌套列表每个子列表的首个元素填充Spinner

Android 汇率API货币代码提取及Spinner填充实现方案

以下是基于你现有架构的分步实现方案:


1. 确认基础数据类结构

首先确保你的返回解析类结构符合预期,示例如下:

data class CurrencyResponse(
    val supported_codes: List<List<String>>
    // 其余接口返回字段按需补充
)

2. CurrencyRepository 层数据处理

在原有请求逻辑基础上,直接提取嵌套列表的首元素,返回纯净的货币代码列表:

class CurrencyRepository {
    // 已有的API请求服务实例
    private val apiService = YourExchangeRateApiService.create()

    suspend fun getSupportedCurrencyCodes(): List<String> {
        val response = apiService.getSupportedCurrencies()
        // 提取每个子列表的第一个元素,自动过滤空值避免崩溃
        return response.supported_codes.mapNotNull { subList -> subList.firstOrNull() }
    }
}

3. CurrencyViewModel 层数据暴露

通过LiveData或者StateFlow将处理好的货币代码暴露给UI层观察:

基于LiveData实现

class CurrencyViewModel(private val repository: CurrencyRepository) : ViewModel() {
    private val _currencyCodes = MutableLiveData<List<String>>()
    val currencyCodes: LiveData<List<String>> = _currencyCodes

    fun loadSupportedCurrencies() {
        viewModelScope.launch {
            val codeList = repository.getSupportedCurrencyCodes()
            _currencyCodes.postValue(codeList)
        }
    }
}

基于StateFlow实现(更推荐协程架构)

class CurrencyViewModel(private val repository: CurrencyRepository) : ViewModel() {
    private val _currencyCodes = MutableStateFlow<List<String>>(emptyList())
    val currencyCodes: StateFlow<List<String>> = _currencyCodes.asStateFlow()

    fun loadSupportedCurrencies() {
        viewModelScope.launch {
            val codeList = repository.getSupportedCurrencyCodes()
            _currencyCodes.value = codeList
        }
    }
}

4. HomeFragment 层填充Spinner

观察ViewModel的数据,拿到后转数组给Spinner设置适配器:

对应LiveData的观察逻辑

class HomeFragment : Fragment() {
    private lateinit var viewModel: CurrencyViewModel
    private lateinit var currencySpinner: Spinner

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 初始化ViewModel、绑定Spinner控件的原有逻辑保持不变
        viewModel.loadSupportedCurrencies()

        viewModel.currencyCodes.observe(viewLifecycleOwner) { codeList ->
            // 列表转数组
            val codeArray = codeList.toTypedArray()
            // 适配器可替换为自定义布局,这里用系统默认布局做示例
            val spinnerAdapter = ArrayAdapter(
                requireContext(),
                android.R.layout.simple_spinner_item,
                codeArray
            )
            spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            currencySpinner.adapter = spinnerAdapter
        }
    }
}

对应StateFlow的观察逻辑

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel.loadSupportedCurrencies()

    lifecycleScope.launch {
        repeatOnLifecycle(Lifecycle.State.STARTED) {
            viewModel.currencyCodes.collect { codeList ->
                val codeArray = codeList.toTypedArray()
                val spinnerAdapter = ArrayAdapter(
                    requireContext(),
                    android.R.layout.simple_spinner_item,
                    codeArray
                )
                spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
                currencySpinner.adapter = spinnerAdapter
            }
        }
    }
}

注意:如果需要在下拉列表同时显示货币代码和名称,只需调整Repository层的返回逻辑,返回拼接好的字符串列表即可,无需改动后续流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:06:07