Android 多视图类型RecyclerView图像滚动视图大小更改

Android 多视图类型RecyclerView图像滚动视图大小更改,android,android-layout,android-recyclerview,imageview,android-glide,Android,Android Layout,Android Recyclerview,Imageview,Android Glide,我有一个具有多种视图类型的recyclerview。其中一个在布局中具有imageview <ImageView android:id="@+id/img_rcv_msg_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true

我有一个具有多种视图类型的
recyclerview
。其中一个在布局中具有
imageview

<ImageView
    android:id="@+id/img_rcv_msg_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    app:imgBottomRightCorner="10dp"
    app:imgTopLeftCorner="10dp"
    app:srcCompat="@android:drawable/ic_menu_report_image"
    tools:ignore="ContentDescription" />
我已经编程的代码,使图像文件的尺寸有效,使它适合屏幕。 但是,当我滚动
recyclerView
时,相同的图像会以不同的大小显示。。。!! 为什么会这样

编辑:
在使用Glide设置图像之前,我添加了布局(0,0,0,0),但现在的问题是,创建视图的时刻图像有0个维度,Glide加载图像后的时刻有相应的维度。因为已经创建的项目改变了其高度,所以上述所有项目都被向上推

之所以会出现这种情况,是因为持视图者重复使用对象,当您滚动时,它将显示一些以前加载的图像。您可以使用
.diskCacheStrategy(diskCacheStrategy.NONE)
和Glide停止此操作,如下所示:

Glide.with(activityContext)
     .load(yourFileDataModel)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(yourImageView);
Glide.with(activityContext)
     .load(yourFileDataModel)
     .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
     .into(yourImageView);
或者您可以使用如下签名:

Glide.with(activityContext)
     .load(yourFileDataModel)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(yourImageView);
Glide.with(activityContext)
     .load(yourFileDataModel)
     .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
     .into(yourImageView);

每次在适配器的
onBindViewHolder
方法中回收视图时,尝试将
ViewHolder
中的图像重置为原始大小

这样,当视图被回收(滚动时),
ImageView
可以重置为原始大小

onBindViewHolder(...)
    holder.imageView.layout(0, 0, 0, 0);

来源:对@TWiStErRob的评论经过大量研究后,我最终提出了一个定制解决方案,因为您无法拥有一个包含宽度和高度的包裹内容的ImageView,也无法期望recyclerview在滚动后不更改大小。 我所做的是必须使用图像视图,一个用于纵向视图,另一个用于横向视图和立方体视图

 <ImageView
            android:id="@+id/img_snt_msg_image_landscape"
            android:layout_width="320dp"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:scaleType="fitXY"
            android:maxWidth="320dp"
            android:maxHeight="320dp"
            android:minWidth="150dp"
            android:minHeight="150dp"
            android:src="@drawable/error_image"
            app:imgBottomRightCorner="10dp"
            app:imgTopLeftCorner="10dp"
            tools:ignore="ContentDescription" />

 <ImageView
            android:id="@+id/img_snt_msg_image_portrait"
            android:layout_width="wrap_content"
            android:layout_height="320dp"
            android:adjustViewBounds="true"
            android:scaleType="fitXY"
            android:maxWidth="320dp"
            android:maxHeight="320dp"
            android:minWidth="150dp"
            android:minHeight="150dp"
            android:src="@drawable/error_image"
            app:imgBottomRightCorner="10dp"
            app:imgTopLeftCorner="10dp"
            tools:ignore="ContentDescription" />


您是否通过编程使其适合屏幕?或者像您在android:scaleType中所做的那样?不,我在xml ImageView属性中只使用scaleType。谢谢。。请检查答案,如果您仍然面临一些问题,请随时告诉我如何在Glide中以编程方式使用fitXY?您可以使用
centerCrop()
centerInside()
fitCenter()
方法:请在此处检查,这似乎也不起作用。ImageView不是RecyclerView中唯一的视图类型。我有其他视图类型,如视频视图、音频视图和简单文本视图。每一个都有动态的维度。你能编辑你的问题并为我们提供更多从布局到适配器的代码吗?看来现在我的行为和预期的一样。我将进一步搜索它。!!谢谢,但是,这会在向下滚动时产生一个问题,因为创建视图时的高度为0,而当“滑动”加载图像时,图像高度大于0,并且突然推送所有项目upwards@james04只是为了确定。。在使用参数0,0,0,0将图像设置为GlideYes之前,请调用
holder.imageView.layout()
。是否可以尝试使用(activityContext).load(previewFile).override(rcvImageView.width).into(rcvImageView)