我正在從 JSON 中的 API 檢索串列串列。這就是回應的樣子。
{
"result":"success",
"documentation":"https://www.exchangerate-api.com/docs",
"terms_of_use":"https://www.exchangerate-api.com/terms"
"supported_codes":[
["AED","UAE Dirham"],
["AFN","Afghan Afghani"],
["ALL","Albanian Lek"],
["AMD","Armenian Dram"],
["ANG","Netherlands Antillian Guilder"],
["AOA","Angolan Kwanza"],
["ARS","Argentine Peso"],
["AUD","Australian Dollar"],
["AWG","Aruban Florin"],
["AZN","Azerbaijani Manat"],
["BAM","Bosnia and Herzegovina Convertible Mark"],
["BBD","Barbados Dollar"] etc. etc.
]
}
這是資料類
data class CurrencyResponse(
@Json(name="documentation") val documentation: String,
@Json(name="result") val result: String,
@Json(name="supported_codes") val supported_codes: List<List<String>>,
@Json(name="terms_of_use") val terms_of_use: String
)
我設法獲取串列串列(supported_codes),但我現在想要的是獲取每個串列的第一個索引(AED、AFN、ALL 等)并將它們存盤在串列中,將其轉換為陣列,然后使用該陣列來填充我的微調器。誰能幫我解決這個問題?
下面是相關代碼。
謝謝你。
CurrencyRepository.kt
package com.example.currencyconverter.data
import com.example.currencyconverter.BuildConfig
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class CurrencyRepository @Inject constructor(private val currencyApi: CurrencyApi) {
suspend fun getConversionRate(baseCurrency: String, toCurrency: String, amount: Double?): ConversionResponse {
return currencyApi.convert(BuildConfig.API_KEY, baseCurrency, toCurrency, amount)
}
suspend fun getCurrencies(): List<String> {
return currencyApi.getCurrencies(BuildConfig.API_KEY).supported_codes
}
}
貨幣視圖模型.kt
package com.example.currencyconverter.ui
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.currencyconverter.data.CurrencyRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class CurrencyViewModel @Inject constructor(private val repository: CurrencyRepository): ViewModel() {
private val _conversionResult = MutableLiveData<String>()
val conversionResult: LiveData<String> = _conversionResult
private val _currencies = MutableLiveData<List<String>>()
val currencies: LiveData<List<String>> = _currencies
init {
getCurrencies()
}
fun getConversionRate(baseCurrency: String, toCurrency: String, amount: Double?) {
viewModelScope.launch {
_conversionResult.value = repository.getConversionRate(baseCurrency, toCurrency, amount).conversion_result
}
}
fun getCurrencies() {
viewModelScope.launch {
_currencies.value = repository.getCurrencies()
}
}
}
HomeFragment.kt
package com.example.currencyconverter.ui
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.example.currencyconverter.R
import com.example.currencyconverter.databinding.FragmentHomeBinding
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class HomeFragment : Fragment(R.layout.fragment_home) {
private val viewModel by viewModels<CurrencyViewModel>()
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentHomeBinding.bind(view)
lateinit var firstCurrency: String
lateinit var secondCurrency: String
viewModel.currencies.observe(viewLifecycleOwner) {
binding.list.text = " ${it[0]} , ${it[1]} "
}
var currenciesFormat = arrayOf(viewModel.currencies.value?.get(0),
viewModel.currencies.value?.get(1)
)
binding.apply {
spinnerFirst.adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, currenciesFormat)
spinnerFirst.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
adapterView: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
firstCurrency = adapterView?.getItemAtPosition(position).toString()
}
override fun onNothingSelected(p0: AdapterView<*>?) {
}
}
spinnerSecond.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
adapterView: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
secondCurrency = adapterView?.getItemAtPosition(position).toString()
}
override fun onNothingSelected(p0: AdapterView<*>?) {
}
}
}
binding.constraintLayout.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(p0: View?, p1: MotionEvent?): Boolean {
closeKeyboard(p0)
return true
}
})
binding.button.setOnClickListener {
val stringInTextField = binding.amountText.text.toString()
val amount = stringInTextField.toDoubleOrNull()
if (amount == null) {
binding.resultText.text = " "
}
closeKeyboard(binding.amountText)
viewModel.getConversionRate(firstCurrency, secondCurrency, amount)
viewModel.conversionResult.observe(viewLifecycleOwner) {
binding.resultText.text = it
}
}
}
private fun closeKeyboard(view: View?) {
val imm =
view?.context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (view != null) {
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}
}
uj5u.com熱心網友回復:
您可以使用kotlin.collections的map功能。https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map.html
fun main(){
val supportedCodes = listOf(
listOf("AED","UAE Dirham"),
listOf("AFN","Afghan Afghani"),
listOf("ALL","Albanian Lek")
)
val codes = supportedCodes.map { it[0] }
println(codes)
}
輸出是一個串列,只包含每個嵌套串列的第一個元素。
[AED, AFN, ALL]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339445.html
上一篇:向串列的每個元素添加字母
