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

