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)