RecyclerView ViewHolder 在不应该的时候改变视图
RecyclerView ViewHolder changing views when it shouldn't be
对于我的 recyclerview 中的每第 21 个项目,我想将该视图中的图像放大。 应该够简单.
我将此代码添加到我的 IteAdapter 的 onBindViewHolder class:
override fun onBindViewHolder(holder: ItemViewHolder, pos: Int) {
val currentItem = getItem(pos)
val largeItemView = pos >= 21 && pos % 21 == 0
Log.e("ItemAdapter", "Position: $pos, largeItemView bool: $largeItemView")
if (currentItem != null) {
holder.bind(currentItem, pos, largeItemView)
}
}
largeItemView 布尔值传递到我的 ItemViewHolder
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) {
// This is getting called when largeItemView is false??
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 {
Glide.with(itemView)
.load(imageBefore)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageViewItem)
imageViewItem.setOnClickListener {
logProductInfo(item, pos, imageBefore, largeItemView)
}
}
}
}
recyclerview 中每第 21 个项目的高度都会增加。这很棒。然而,recyclerview 中的其他项目随机也有高度增加。我无法解释这一点。我已经设置了日志来显示我点击的项目的位置和布尔值。我将单击一个不应大的大图像项,日志显示 largeItemView 布尔值是 false。那么增加图片尺寸的代码是怎么达到的呢?
以下是日志输出的一些屏幕截图,以备不时之需。
这个问题让我很困惑。对这里发生的事情有什么想法吗?
感谢 Pawel,我有了解决方案
“Viewholders 被重用 - 您的其他情况必须将高度和 scaleType 恢复为默认值,以解决您绑定的 viewholder 绑定到之前触发“largeItemView”的位置的情况
我加了
imageViewItem.layoutParams.height = 600
imageViewItem.scaleType = ImageView.ScaleType.CENTER_CROP
到我的 itemviewholder 中的 else 块,它已经解决了这个问题。
对于我的 recyclerview 中的每第 21 个项目,我想将该视图中的图像放大。 应该够简单.
我将此代码添加到我的 IteAdapter 的 onBindViewHolder class:
override fun onBindViewHolder(holder: ItemViewHolder, pos: Int) {
val currentItem = getItem(pos)
val largeItemView = pos >= 21 && pos % 21 == 0
Log.e("ItemAdapter", "Position: $pos, largeItemView bool: $largeItemView")
if (currentItem != null) {
holder.bind(currentItem, pos, largeItemView)
}
}
largeItemView 布尔值传递到我的 ItemViewHolder
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) {
// This is getting called when largeItemView is false??
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 {
Glide.with(itemView)
.load(imageBefore)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageViewItem)
imageViewItem.setOnClickListener {
logProductInfo(item, pos, imageBefore, largeItemView)
}
}
}
}
recyclerview 中每第 21 个项目的高度都会增加。这很棒。然而,recyclerview 中的其他项目随机也有高度增加。我无法解释这一点。我已经设置了日志来显示我点击的项目的位置和布尔值。我将单击一个不应大的大图像项,日志显示 largeItemView 布尔值是 false。那么增加图片尺寸的代码是怎么达到的呢?
以下是日志输出的一些屏幕截图,以备不时之需。
这个问题让我很困惑。对这里发生的事情有什么想法吗?
感谢 Pawel,我有了解决方案
“Viewholders 被重用 - 您的其他情况必须将高度和 scaleType 恢复为默认值,以解决您绑定的 viewholder 绑定到之前触发“largeItemView”的位置的情况
我加了
imageViewItem.layoutParams.height = 600
imageViewItem.scaleType = ImageView.ScaleType.CENTER_CROP
到我的 itemviewholder 中的 else 块,它已经解决了这个问题。