我正在写一份有关货币的申请. 接收到空数据(Json正常). 我试着调试它,但我不知道错误在哪里,是什么错误. 如果你能帮助我了解错误在哪里,我将不胜感激. 以下是我的代码:

ApiService:你是什么意思?

interface ApiService {

    @GET("daily_json.js")
    suspend fun getValute(): Response<Valute>
}

Retrofit实例:

object RetrofitInstance {

    private val retrofit by lazy {
        Retrofit.Builder().baseUrl("https://www.cbr-xml-daily.ru/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
    val api: ApiService by lazy {
        retrofit.create(ApiService:你是什么意思?:class.java)
    }
}

存储库:

class Repository {

    suspend fun getVal(): Response<Valute>{
        return RetrofitInstance.api.getValute()
    }

}

视图模型:

class Start视图模型: ViewModel() {

    var repo = Repository()
    val moneyList: MutableLiveData<Response<Valute>> = MutableLiveData()


    fun getMoney(){
        viewModelScope.launch {
            moneyList.value = repo.getVal()
        }
    }
}

片段:

       class StartFragment : Fragment() {
        private lateinit var _binding: FragmentStartBinding
        private val binding get() = _binding!!
        private val adapter = StartAdapter()
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            _binding = FragmentStartBinding.inflate(inflater, container, false)
            val view = binding.root
    
    
            return view
    
        }
    
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            binding.rvStart.adapter = adapter
            val viewModel = ViewModelProvider(this).get(Start视图模型::class.java)
            viewModel.getMoney()
            viewModel.moneyList.observe(viewLifecycleOwner,{list ->
                list.body()?.let { adapter.setList(it) }
            })
}

适配器:

class Start适配器: RecyclerView.Adapter<StartAdapter.StartHolder>() {

    var listValute = emptyList<Valute>()

class StartHolder(item: View): RecyclerView.ViewHolder(item) {

    val binding = ItemBinding.bind(item)

    fun bind(valute: Valute) = with(binding){

        nameMoney.text = valute.CharCode
        purchase.text = valute.Value.toString()

    }
}

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StartHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
        return StartHolder(view)
    }

    override fun getItemCount(): Int {
        return listValute.size
    }

    override fun onBindViewHolder(holder: StartHolder, position: Int) {
        holder.bind(listValute[position])
    }

    fun setList(valute: Valute){
        listValute = listOf(valute)
        notifyDataSetChanged()
    }
}

我附上了你可能需要的所有代码.

Update个 我忘了添加DataClass

data class Valute(
    val CharCode: String,
    val ID: String,
    val Name: String,
    val Nominal: Int,
    val NumCode: String,
    val Previous: Double,
    val Value: Double
): Serializable

推荐答案

您的数据模型与API返回的数据模型不匹配. 您的Valute(数据)类是映射的一个元素(位于键"Valute"下).

因此,首先为答案创建一个通用模型,例如如下所示:

data class ValuteResponse(
    @SerializedName("Date")
    val date: String,

    @SerializedName("PreviousDate")
    val previousDate: String,

    @SerializedName("PreviousURL")
    val previousURL: String,

    @SerializedName("Timestamp")
    val timestamp: String,

    @SerializedName("Valute")
    val valute: Map<String, Valute>,
)

在这里,在模型类中,我使用com.google.gson.annotations.SerializedName注释来指示在接收到的响应(JSON)中调用了什么字段.

然后使用它(在ApiService中)作为API的响应模型:

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

有许多网站可以根据您现有的JSON为您创建类:

Json structure: enter image description here

Android相关问答推荐

在Android Studio中陷入了不兼容的Gradle版本的循环

Kotlin Gzip字符串未按预期工作

懒惰的垂直网格中盒子的重量-Jetpack组合

无法在Jetpack Compose中显示Admob原生广告

MAP函数返回单位列表而不是字符列表

不能在LazyGrid-Jetpack Compose中使用填充最大宽度或填充父项最大宽度

如何在Android Studio的LinearLayout中禁用阴影

Android手柄注射周期错误,多个模块引用一个核心模块

如何在使用带有底部导航组件的片段管理器时更改片段工具栏的标签

Jetpack Compose:根据盒子中的最大视图固定宽度和高度

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

制作圆形SupportMapFragment

服务似乎在启动时忽略传递的变量

在 Jetpack Compose 中使用 ViewModel 实现 startActivity 的最佳实践

Android Compose:LazyColumn 和 Column with verticalScroll 的区别

Android Studio 错误要求依赖它的库和应用程序针对 Android API 的 33 版或更高版本进行编译.

插入查询室 OnConflictStrategy.REPLACE

如何将房间数据库导出到 .CSV

Android Jetpack Compose - 找不到 R.drawable?

Jetpack 使用 Canvas 组成半圆