android 空数据来自改造

c9qzyr3d  于 2023-10-14  发布在  Android
关注(0)|答案(1)|浏览(150)

我在写一份外汇申请。接收到空数据(Json正常)。我试着调试它,但我不明白错误在哪里,是什么。如果您能帮助我了解错误或错误在哪里,我将不胜感激。下面是我的代码:
ApiService:

  1. interface ApiService {
  2. @GET("daily_json.js")
  3. suspend fun getValute(): Response<Valute>
  4. }

RetrofitInstance:

  1. object RetrofitInstance {
  2. private val retrofit by lazy {
  3. Retrofit.Builder().baseUrl("https://www.cbr-xml-daily.ru/")
  4. .addConverterFactory(GsonConverterFactory.create())
  5. .build()
  6. }
  7. val api: ApiService by lazy {
  8. retrofit.create(ApiService::class.java)
  9. }
  10. }

资料档案库:

  1. class Repository {
  2. suspend fun getVal(): Response<Valute>{
  3. return RetrofitInstance.api.getValute()
  4. }
  5. }

视图模型:

  1. class StartViewModel: ViewModel() {
  2. var repo = Repository()
  3. val moneyList: MutableLiveData<Response<Valute>> = MutableLiveData()
  4. fun getMoney(){
  5. viewModelScope.launch {
  6. moneyList.value = repo.getVal()
  7. }
  8. }
  9. }

片段:

  1. class StartFragment : Fragment() {
  2. private lateinit var _binding: FragmentStartBinding
  3. private val binding get() = _binding!!
  4. private val adapter = StartAdapter()
  5. override fun onCreateView(
  6. inflater: LayoutInflater, container: ViewGroup?,
  7. savedInstanceState: Bundle?
  8. ): View? {
  9. _binding = FragmentStartBinding.inflate(inflater, container, false)
  10. val view = binding.root
  11. return view
  12. }
  13. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  14. super.onViewCreated(view, savedInstanceState)
  15. binding.rvStart.adapter = adapter
  16. val viewModel = ViewModelProvider(this).get(StartViewModel::class.java)
  17. viewModel.getMoney()
  18. viewModel.moneyList.observe(viewLifecycleOwner,{list ->
  19. list.body()?.let { adapter.setList(it) }
  20. })
  21. }

适配器:

  1. class StartAdapter: RecyclerView.Adapter<StartAdapter.StartHolder>() {
  2. var listValute = emptyList<Valute>()
  3. class StartHolder(item: View): RecyclerView.ViewHolder(item) {
  4. val binding = ItemBinding.bind(item)
  5. fun bind(valute: Valute) = with(binding){
  6. nameMoney.text = valute.CharCode
  7. purchase.text = valute.Value.toString()
  8. }
  9. }
  10. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StartHolder {
  11. val view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
  12. return StartHolder(view)
  13. }
  14. override fun getItemCount(): Int {
  15. return listValute.size
  16. }
  17. override fun onBindViewHolder(holder: StartHolder, position: Int) {
  18. holder.bind(listValute[position])
  19. }
  20. fun setList(valute: Valute){
  21. listValute = listOf(valute)
  22. notifyDataSetChanged()
  23. }
  24. }

我把你可能需要的代码都附上了。

更新忘记添加DataClass

  1. data class Valute(
  2. val CharCode: String,
  3. val ID: String,
  4. val Name: String,
  5. val Nominal: Int,
  6. val NumCode: String,
  7. val Previous: Double,
  8. val Value: Double
  9. ): Serializable
zyfwsgd6

zyfwsgd61#

您的数据模型与从API返回的数据模型不匹配。您的Valute(data)类是map的一个元素(位于键“Valute”下)。
所以首先为答案创建一个通用模型,例如:

  1. data class ValuteResponse(
  2. @SerializedName("Date")
  3. val date: String,
  4. @SerializedName("PreviousDate")
  5. val previousDate: String,
  6. @SerializedName("PreviousURL")
  7. val previousURL: String,
  8. @SerializedName("Timestamp")
  9. val timestamp: String,
  10. @SerializedName("Valute")
  11. val valute: Map<String, Valute>,
  12. )

在这里,在模型类中,我使用com.google.gson.annotations.SerializedName注解来指示在接收到的响应(JSON)中调用的字段。
然后使用它(在ApiService中)作为来自API的响应模型:

  1. @GET("daily_json.js")
  2. suspend fun getValute(): Response<ValuteResponse>

有很多网站可以从你现有的JSON创建类:

JSON结构:

展开查看全部

相关问题