如问题中所述,我有一个显示不同高度图像的RecyclerView。
ImageView的高度最初为0dp,宽度为match_parent,但在BindViewHolder中,我将高度设置为正确的值。
如果向下滚动列表,但向下滚动时,它可以正常工作: 绘制之前的ViewHolder时,它的高度最初设置为40dp,因为图像尚未加载,但随后新的高度被设置为ImgeView,它突然跳转到400,这使它成为非常紧张,根本不光滑。
我尝试过预取和缓存,但没有任何效果。
我是否应该使用ListView并按需加载图片,知道显示的项目数量将达到1000,或者我该怎么办?
是ViewHolder布局
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardElevation="8dp"
app:cardCornerRadius="8dp"
android:layout_margin="8dp">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
android:id="@+id/post_image"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"/>
</android.support.constraint.ConstraintLayout>
这是OnBindViewHolder
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val target: SimpleTarget<File> = object: SimpleTarget<File>() {
override fun onResourceReady(resource: File, transition: Transition<in File>?) {
thumbnail.setImage(ImageSource.uri(Uri.fromFile(resource)).tilingEnabled())
}
}
if (post?.url?.endsWith(".jpg", true) == true|| post?.url?.endsWith(".png", true) == true) {
thumbnail.visibility = View.VISIBLE
thumbnail.recycle()
thumbnail.setDoubleTapZoomDuration(300)
if(post.preview != null) {
thumbnail.post {
val scale: Float = post.preview.images[0].source.height.toFloat()/post.preview.images[0].source.width.toFloat()
val layoutParams: ViewGroup.LayoutParams = thumbnail.layoutParams
layoutParams.height = (thumbnail.measuredWidth.toFloat() * scale).toInt()
thumbnail.layoutParams = layoutParams
glide.downloadOnly().load(post.preview.images[0].source.url).into(target)
}
}
} else {
thumbnail.visibility = View.GONE
glide.clear(target)
thumbnail.recycle()
}
}
}
缩略图为SSIV
答案 0 :(得分:0)
问题是我每次都异步测量宽度,导致设置高度延迟。
我在OnCreateViewHolder上计算了measuredHeight并将其存储起来供以后使用。