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

