RecyclerView仅显示JSON数组最后一项及petPhoto传递问题求助
问题解决方案
一、修复RecyclerView重复显示最后一项的问题
核心排查方向及解决:
数据集合填充逻辑错误
检查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) }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) }集合更新逻辑验证
确认更新Adapter数据时,有没有把同一个对象重复添加到集合,或者用了错误的集合操作(比如Collections.fill这类会覆盖所有元素的方法)。
二、修复petPhoto无法传递的问题
常见排查点:
数据类字段匹配问题
如果用了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? )图片加载逻辑问题
先确认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或二进制数据,要对应调整加载逻辑。
数据链路全流程检查
- 看日志确认服务器返回的petPhoto字段有没有值,ViewModel里有没有正确接收。
- 检查从服务器模型转本地数据库模型的过程中,有没有漏掉petPhoto的赋值。
三、验证步骤
- 填充数据后打印petList的每个元素,确认每个对象的字段值都是唯一且正确的。
- 在Adapter的
onBindViewHolder里打印当前position对应的pet数据,确认传递给ViewHolder的是正确项。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

