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

Android Studio中Retrofit请求后将API数据添加至数组用于RecyclerView

解决将接口对象添加到List并在RecyclerView展示的问题

嘿,我来帮你搞定这个问题!看起来你已经成功拿到了接口数据,卡在了把uf、dolar、euro、utm这几个对象转成列表供RecyclerView使用这一步对吧?别担心,咱们一步步拆解解决。

第一步:确保实体类正确实现IEconomicoObject接口

首先要确认你定义的uf、dolar等实体类,都已经实现了IEconomicoObject接口,并且覆盖了RecyclerView展示需要的所有方法。比如接口可以定义成这样:

interface IEconomicoObject {
    fun getNombre(): String
    fun getValor(): Double
    fun getCodigo(): String
    // 按需添加你需要展示的其他字段,比如日期
}

然后每个实体类都要实现这个接口,以Uf为例:

data class Uf(
    val nombre: String,
    val codigo: String,
    val valor: Double,
    val fecha: String
) : IEconomicoObject {
    override fun getNombre(): String = nombre
    override fun getValor(): Double = valor
    override fun getCodigo(): String = codigo
}

同理,Dolar、Euro、Utm类也要完全照搬这个模式实现接口。

第二步:解析接口数据并构建列表

假设你用Retrofit请求接口,首先要定义对应的响应类来接收整个接口返回的JSON:

data class IndicadoresResponse(
    val uf: Uf?,
    val dolar: Dolar?,
    val euro: Euro?,
    val utm: Utm?
)

拿到响应数据后,就可以逐个将非空的对象添加到列表里(一定要做空安全判断,避免空指针):

val economicoList = mutableListOf<IEconomicoObject>()

// 逐个添加,确保对象不为空
response.uf?.let { economicoList.add(it) }
response.dolar?.let { economicoList.add(it) }
response.euro?.let { economicoList.add(it) }
response.utm?.let { economicoList.add(it) }

如果是用Gson手动解析JSON,逻辑也是一样的:先解析出四个对象,再逐个判断非空后加入列表。

第三步:适配RecyclerView展示

接下来要确保你的RecyclerView Adapter是基于IEconomicoObject类型编写的,这样才能正确接收和绑定数据。示例Adapter代码如下:

class EconomicoAdapter : RecyclerView.Adapter<EconomicoAdapter.ViewHolder>() {
    private var itemList = emptyList<IEconomicoObject>()

    // 更新列表的方法
    fun submitList(newList: List<IEconomicoObject>) {
        itemList = newList
        notifyDataSetChanged()
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val tvNombre: TextView = itemView.findViewById(R.id.tv_nombre)
        private val tvValor: TextView = itemView.findViewById(R.id.tv_valor)
        private val tvCodigo: TextView = itemView.findViewById(R.id.tv_codigo)

        fun bind(item: IEconomicoObject) {
            tvNombre.text = item.getNombre()
            tvValor.text = String.format("%,.2f", item.getValor()) // 格式化数值展示
            tvCodigo.text = item.getCodigo()
        }
    }

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

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

    override fun getItemCount(): Int = itemList.size
}

最后把构建好的列表传给Adapter就行:

yourAdapter.submitList(economicoList)

额外注意点

  • 如果接口返回的valor字段是字符串格式(比如带千分位逗号),记得在实体类里做转换处理,避免NumberFormatException:
    override fun getValor(): Double {
        return valorString.replace(".", "").replace(",", ".").toDouble()
    }
    
  • 检查接口返回的字段名和实体类的变量名是否匹配,必要时用@SerializedName注解映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:08:28