当高度不固定时,RecyclerView向上滚动不平滑

时间:2018-06-11 19:39:11

标签: android android-recyclerview

如问题中所述,我有一个显示不同高度图像的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

1 个答案:

答案 0 :(得分:0)

问题是我每次都异步测量宽度,导致设置高度延迟。

我在OnCreateViewHolder上计算了measuredHeight并将其存储起来供以后使用。