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
相关产品推荐
相关产品推荐

