Coil in RecyclerView does not load new content on scroll

Viewed 1179

Help me please.
I use Coil to show images in grid RecyclerView.
The implementation is very straightforward - in each viewholder.bind() i call image.load(URL).
URL is static URL = "https://loremflickr.com/200/200/" and simply provides a new random picture on each request .
When RecyclerView creates holders on app launch, image.load(URL) works just fine, loading new image for each holder.
Problem: When I start to scroll the recycer, image.load(URL) just takes latest downloaded picture instead of downloading new one. I used loggerInterceptor to see that image.load(URL) performs real http calls only for first portion of holders.
Question: How can I make Coil to download new picture for each viewholder in recyclerView, not only for first group of visible holders?

enter image description here

The holder:

class ImageViewHolder(val binding: ItemImageBinding) : RecyclerView.ViewHolder(binding.root) {
 
    fun bind() {
        binding.image.load(URL){}
    }
 
    companion object {
        fun create(parent: ViewGroup): ImageViewHolder {
            val layoutInflater = LayoutInflater.from(parent.context)
            val binding = ItemImageBinding.inflate(layoutInflater)
            return ImageViewHolder(binding)
        }
    }
}

The adapter:


class ImageRvAdapter(val list: MutableList<ImageModel>) : ListAdapter<ImageModel, ImageViewHolder>(
    IMAGE_COMPARATOR
) {
 
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
        return ImageViewHolder.create(parent)
    }
 
    override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
        holder.bind()
    }
 
    companion object {
        val IMAGE_COMPARATOR = object : DiffUtil.ItemCallback<ImageModel>() {
            override fun areItemsTheSame(oldItem: ImageModel, newItem: ImageModel): Boolean {
                return newItem::class == oldItem::class
            }
 
            override fun areContentsTheSame(oldItem: ImageModel, newItem: ImageModel): Boolean {
                return oldItem == newItem
            }
        }
    } }

Adapter setup:

   //Data model for list
    sealed class ImageModel{
        object Image:ImageModel()
    }
    //Adapter setup
    lateinit var adatper: ImageRvAdapter
    private fun initRecyclerView() {
        //creating a list of 140 items
        val imageList: MutableList<ImageModel> = mutableListOf()
        for (i in 0..139){  
            imageList.add(ImageModel.Image)
        }
        //adapter stuff
        adatper = ImageRvAdapter()
        binding.recyclerView.layoutManager = GridLayoutManager(
            this,
            6,
            GridLayoutManager.HORIZONTAL,
            false
        )
        binding.recyclerView.adapter = adatper
        adatper.submitList(imageList) 
    }
0 Answers
Related