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?
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)
}