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

RecyclerView仅显示JSON数组最后一项及petPhoto传递问题求助

问题解决方案

一、修复RecyclerView重复显示最后一项的问题

核心排查方向及解决:

  1. 数据集合填充逻辑错误
    检查ViewModel/Activity里的代码,是不是循环时复用了同一个Pet对象实例:

    // 错误写法:全程用同一个对象,所有列表项都会指向最后一次修改的内容
    val petList = mutableListOf<Pet>()
    val pet = Pet()
    for (data in serverResponse.pets) {
        pet.name = data.name
        pet.age = data.age
        petList.add(pet)
    }
    

    改成每次循环都创建新对象:

    // 正确写法:每次循环生成新实例,保证每个列表项都是独立对象
    val petList = mutableListOf<Pet>()
    for (data in serverResponse.pets) {
        val pet = Pet(
            name = data.name,
            age = data.age,
            petPhoto = data.petPhoto
            // 其他字段按需赋值
        )
        petList.add(pet)
    }
    
  2. Adapter绑定逻辑错误
    检查PetAdapter的onBindViewHolder方法,有没有正确根据position取对应数据:

    // 错误写法:误用了全局变量或固定对象
    override fun onBindViewHolder(holder: PetViewHolder, position: Int) {
        val pet = lastPetItem // 这里直接用了最后一个对象,导致所有项重复
        holder.bind(pet)
    }
    

    正确写法:

    override fun onBindViewHolder(holder: PetViewHolder, position: Int) {
        val pet = petList[position] // 按当前position取对应列表项
        holder.bind(pet)
    }
    
  3. 集合更新逻辑验证
    确认更新Adapter数据时,有没有把同一个对象重复添加到集合,或者用了错误的集合操作(比如Collections.fill这类会覆盖所有元素的方法)。

二、修复petPhoto无法传递的问题

常见排查点:

  1. 数据类字段匹配问题
    如果用了Gson/Retrofit,检查Pet数据类的字段名是否和服务器返回的一致,不一致就加@SerializedName注解:

    import com.google.gson.annotations.SerializedName
    
    data class Pet(
        val name: String,
        val age: Int,
        @SerializedName("pet_photo") // 服务器返回的字段是下划线格式时,需要对应映射
        val petPhoto: String?
    )
    
  2. 图片加载逻辑问题
    先确认petPhoto是有效的URL字符串,再检查Adapter里的图片加载代码:

    // 示例:用Glide加载图片的正确写法
    fun bind(pet: Pet) {
        pet.petPhoto?.let { url ->
            Glide.with(itemView.context)
                .load(url)
                .into(ivPetPhoto)
        } ?: ivPetPhoto.setImageResource(R.drawable.default_pet) // 空值时显示默认图
    }
    

    如果petPhoto是本地资源ID或二进制数据,要对应调整加载逻辑。

  3. 数据链路全流程检查

    • 看日志确认服务器返回的petPhoto字段有没有值,ViewModel里有没有正确接收。
    • 检查从服务器模型转本地数据库模型的过程中,有没有漏掉petPhoto的赋值。

三、验证步骤

  • 填充数据后打印petList的每个元素,确认每个对象的字段值都是唯一且正确的。
  • 在Adapter的onBindViewHolder里打印当前position对应的pet数据,确认传递给ViewHolder的是正确项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:10:16