滑行:滚动时图像闪烁

时间:2020-06-10 07:58:01

标签: android kotlin android-recyclerview android-glide android-viewpager2

enter image description here

我正在使用Groupie RecyclerView来显示一些数据,并使用CardSlider Library和带有Glide的ViewPager2来显示多个图像。我遇到的是,在图像加载了名字之后,UI可以按原样正常显示图像。但是,当我继续滚动时,特定项目/位置中的某些图像会缩小。我一直在寻找并尝试了一些解决方案,但似乎都不起作用。

这些是我当前的代码示例:

PostsAdapter

class PostsAdapter(val posts: Posts?) : Item() {

override fun bind(viewHolder: GroupieViewHolder, position: Int) {
    posts?.apply {
        viewHolder.updateName(profile.fullName)
        viewHolder.updateFeedMessage(feed.message)
        viewHolder.updateMediaViewPager(posts)
        viewHolder.updateReactionCount(feed.reactionCount)
        viewHolder.updateReactionIcon(hasReacted)
        viewHolder.updateCommentCount(feed.commentCount)
    }
}

override fun getLayout(): Int = R.layout.item_post_contents

private fun GroupieViewHolder.updateName(name: String) {
    containerView.txtUserName.text = name
}

private fun GroupieViewHolder.updateFeedMessage(message: String?) {
    containerView.txtFeedMessage.text = message
}

private fun GroupieViewHolder.updateMediaViewPager(posts: Posts?) {
    val images = listOfNotNull(
        posts?.mediaOne?.largeUrl,
        posts?.mediaTwo?.largeUrl,
        posts?.mediaThree?.largeUrl,
        posts?.mediaFour?.largeUrl,
        posts?.mediaFive?.largeUrl
    )

    if (images.size <= 1) {
        val requestOptions = RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)
        Glide.with(containerView.imgMediaOne.context)
            .load(posts?.mediaOne?.largeUrl).apply(requestOptions)
            .dontAnimate()
            .override(1000, 800)
            .into(containerView.imgMediaOne)
            .clearOnDetach()

        containerView.mediaViewPager.visibility = View.GONE
        containerView.indicator.visibility = View.GONE
    } else {
        val adapter = MediaViewPagerAdapter(images)
        containerView.mediaViewPager.adapter = adapter
        containerView.imgMediaOne.visibility = View.GONE
    }
}

private fun GroupieViewHolder.updateReactionCount(reactionCount: Int?) {
    containerView.txtReactionCount.text =
        if (reactionCount == 0) "" else reactionCount.toString()
}

private fun GroupieViewHolder.updateReactionIcon(isReacted: Boolean) {
    if (isReacted) {
        containerView.imgReaction.setImageResource(R.drawable.ic_heart_clicked)
    } else {
        containerView.imgReaction.setImageResource(R.drawable.ic_heart_unclicked)
    }
}

private fun GroupieViewHolder.updateCommentCount(commentCount: Int?) {
    containerView.txtCommentCount.text = if (commentCount == 0) "" else commentCount.toString()
}
}

MediaViewPagerAdapter

class MediaViewPagerAdapter(
    private val images: List<String?>
) : CardSliderAdapter<MediaViewPagerAdapter.ViewPagerHolder>() {

inner class ViewPagerHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewPagerHolder {
    val view = LayoutInflater
        .from(parent.context)
        .inflate(R.layout.item_media_content, parent, false)

    return ViewPagerHolder(view)
}

override fun getItemCount(): Int = images.size

override fun bindVH(holder: ViewPagerHolder, position: Int) {
    val currentImage = images[position]
    val requestOptions = RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)

    Glide
        .with(holder.itemView.imgMedia.context)
        .load(currentImage).apply(requestOptions)
        .dontAnimate()
        .override(1500, 1200)
        .centerCrop()
        .into(holder.itemView.imgMedia)
        .clearOnDetach()
}
}

imgMediaOne ImageView

  <androidx.appcompat.widget.AppCompatImageView
    android:id="@+id/imgMediaOne"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/dp_6"
    android:background="@android:color/transparent"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    app:layout_constraintBottom_toTopOf="@id/postBottomBar"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/txtFeedMessage" />

imgMedia ImageView

 <androidx.appcompat.widget.AppCompatImageView
    android:id="@+id/imgMedia"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:background="@android:color/transparent"
    android:scaleType="fitXY"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

0 个答案:

没有答案