Recycler View 中的 ImageView - 滚动会导致所有图像具有相同的宽度

ImageView in Recycler View - Scrolling causes all images to have same width

我有一个带有图像的 Recycler View,其中图像的宽度是可变的,但高度是固定的。但是,滚动会导致所有图像具有相同的宽度。我的猜测是 view holder 宽度没有得到正确更新,它只是使用前一个[我正在使用异步图像加载器]。但是,清除可绘制图像,将其设置为 GONE 然后再次 VISIBLE 也不起作用。但是,如果我关闭屏幕并重新打开它,它会重新正确绘制。

我的视图持有者项目中有以下内容。请注意,高度是固定的,但宽度是 wrap_content。如果高度不固定且为wrap_content,则不会重现此问题。

这是我的 item_view.xml 的样子:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

   <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="150dp"
        android:scaleType="centerInside"/>

</RelativeLayout>

来自 ScaleType documentation 它说,

CENTER_INSIDE: Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding).

RecycleView 使用相同的 xml 来填充所有项目,因此当它在原始图像中发现不同的尺寸时,因为您使用固定的 layout_heightscale_type center_inside, who图片缩放后会自动适配item。

如果你想为不同的图像尺寸使用不同的 interm 大小,你必须使用 custom 项目视图。

CENTER_INSIDE: 统一缩放图像(保持图像的宽高比)所以你的imageview总是有 height = 150dp 但是根据你的图像宽高比,每张图像的宽度都会不同所以 width = 150 ×(original_image_width×original_image_height)dp。尝试 imageview scaltype fitXY 它保持高度 150dp 和宽度等于原始图像高度。