вложенный recyclerview с использованием адаптера подкачки (страница 3) показывает неправильное изображение после прокрутки

Как решить проблему с изображением дочернего адаптера, которое изменяется и показывает неправильные изображения после прокрутки?

это мой код

Родительский класс данных

data class Review(
   val author: String,
   val date: String,
   val rating: Float,
   val comment: String,
   val images: List<Image>)

Дочерний класс данных

Для автора и комментария я беру его только из родительского класса данных

data class Image(
   var author: String? = null,
   var comment: String? = null,
   val large: String,
   val thumbnail: String)

ParentAdapter

class ReviewAdapter(private val callback: ProductReviewImageAdapterCallback) :
PagingDataAdapter<Review, ReviewAdapter.ListViewHolder>(DIFF_CALLBACK) {

private val viewPool = RecyclerView.RecycledViewPool()

private val imageAdapter: ProductReviewImageAdapter by lazy {
    ProductReviewImageAdapter(callback)
}

companion object {
    private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Review>() {
        override fun areItemsTheSame(oldItem: Review, newItem: Review): Boolean {
            return oldItem.author == newItem.author
        }

        override fun areContentsTheSame(oldItem: Review, newItem: Review): Boolean {
            return oldItem.comment == newItem.comment
        }
    }
}


inner class ListViewHolder(itemBinding: ItemProductReviewBinding) :
    RecyclerView.ViewHolder(itemBinding.root) {
    val binding = ItemProductReviewBinding.bind(itemBinding.root)
    fun bind(data: Review, position: Int) {
      with(binding) {
            if (data.images.isEmpty()) {
                rvImageReview.gone()
            } else {
                setupImagesRecyclerView(rvImageReview)
                rvImageReview.visible()
                imageAdapter.differ.submitList(data.images)
            }

            tvNameReviewer.text = data.author
            tvReviewDesc.text = data.comment
            tvDateReview.text = data.date
            ratingBarReview.rating = data.rating

        }
    }
}


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder =
    ListViewHolder(
        ItemProductReviewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    )

override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
    val review = getItem(position)

    if (review != null) {
        holder.bind(review, position)
    }
}

private fun setupImagesRecyclerView(recyclerView: RecyclerView) {
    recyclerView.apply {
        layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
        adapter = imageAdapter
        setRecycledViewPool(viewPool)
        setItemViewCacheSize(20)
    }
}

}

ChildAdapter

class ProductReviewImageAdapter(private val callback: ProductReviewImageAdapterCallback) : RecyclerView.Adapter<ProductReviewImageAdapter.ListViewHolder>() {
private val diffCallback = object : DiffUtil.ItemCallback<Image>() {
    override fun areItemsTheSame(
        oldItem: Image,
        newItem: Image
    ): Boolean {
        return oldItem.author == newItem.author
    }

    override fun areContentsTheSame(
        oldItem: Image,
        newItem: Image
    ): Boolean {
        return oldItem.comment == newItem.comment
    }

}

val differ = AsyncListDiffer(this, diffCallback)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder =
    ListViewHolder(
        ItemImageBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    )

override fun getItemCount(): Int = differ.currentList.size

override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
    holder.bind(differ.currentList[position], position)
}

inner class ListViewHolder(itemBinding: ItemImageBinding) :
    RecyclerView.ViewHolder(itemBinding.root) {
    private val itemBinding = ItemImageBinding.bind(itemBinding.root)
    fun bind(data: Image, position: Int) {
        with(itemBinding) {

            image.loadImageRoundedCorner(data.thumbnail)

            image.setOnClickListener {
                callback.onProductReviewImageClicked(position, differ.currentList)
            }

        }

    }
}

}

Перед прокруткой

при первой загрузке первые данные позиции отображают соответствующее изображение

перед прокруткой

После небольшой прокрутки

изображение в данных первой позиции меняется на изображение в следующих данных

после небольшой прокрутки

Прокрутите до последних данных / страницу

последнее изображение показывает неподходящее изображение

перейти к последним данным / странице

*Запись

  • есть только 5 данных, и только первые и последние данные содержат изображение
  • Изображение в данных первой позиции должно быть изображением человека, а изображение последней позиции должно быть изображением розового цвета.
  • Я использую Coil в качестве загрузчика изображений и использовал метод ImageView.clear() перед загрузкой изображения.

Заранее спасибо, извините, если мой английский плохой. Я не носитель языка

1 ответ

Решение

Обновить

Исправлено: оказалось, что это было неправильно только во время инициализации адаптера, адаптер должен быть инициализирован в onBindViewHolder, а не в родительском адаптере, чтобы не все элементы имели один и тот же адаптер, что приводит к изменению всех данных

Другие вопросы по тегам