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

RecyclerView仅第21项需放大图片却随机出现大图异常如何解决

问题根源

这是RecyclerView ViewHolder复用机制导致的典型问题:
你在largeItemView = true的分支里修改了imageViewItem的高度、scaleType属性,但在largeItemView = false的分支里没有对这两个属性做重置,当显示过放大item的ViewHolder被复用到普通位置时,之前修改的属性会被保留,哪怕你没有走放大的代码分支,View也会保持之前的放大状态。

修复方案

在else分支中补充对ImageView高度、scaleType的重置逻辑即可,示例代码如下:

class ItemViewHolder(private val binding: ShopProductItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: RoomItem, pos: Int, largeItemView: Boolean) {
    var imageBefore = item.product_image_list?.substringBefore(',')
    imageBefore = addHttpsToImageUrl(imageBefore)
    if (largeItemView) {
        binding.apply {
            // 放大状态的属性设置
            imageViewItem.layoutParams.height = 800
            imageViewItem.scaleType = ImageView.ScaleType.FIT_XY
            Glide.with(itemView)
                .load(imageBefore)
                .transition(DrawableTransitionOptions.withCrossFade())
                .into(imageViewItem)
            imageViewItem.setOnClickListener {
                logProductInfo(item, pos, imageBefore, largeItemView)
            }
        }
    } else {
        binding.apply {
            // 补充普通状态的属性重置,高度填你xml中定义的正常值即可,单位为px
            imageViewItem.layoutParams.height = 400 // 替换为你实际的普通item图片高度
            imageViewItem.scaleType = ImageView.ScaleType.CENTER_CROP // 重置为普通状态的缩放类型
            Glide.with(itemView)
                .load(imageBefore)
                .centerCrop()
                .transition(DrawableTransitionOptions.withCrossFade())
                .into(imageViewItem)
            imageViewItem.setOnClickListener {
                logProductInfo(item, pos, imageBefore, largeItemView)
            }
        }
    }
}
}

注意事项

所有在bind方法中动态修改的View属性,都需要在对应的相反逻辑分支中做重置,避免ViewHolder复用带来的属性残留问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:30:03