Катушка в RecyclerView не загружает новое содержимое при прокрутке

#android #android-recyclerview #gridlayoutmanager #image-loading #coil

#Android #android-recyclerview #gridlayoutmanager #загрузка изображения #катушка

Вопрос:

Помогите мне, пожалуйста.
Я использую Coil для отображения изображений в grid RecyclerView.
Реализация очень проста — в каждом viewholder.bind() , который я вызываю image.load(URL) .
URL является статическим URL = "https://loremflickr.com/200/200/" и просто предоставляет новое случайное изображение при каждом запросе.
При RecyclerView создании держателей при запуске приложения image.load(URL) работает просто отлично, загружая новое изображение для каждого держателя.
Проблема: когда я начинаю прокручивать переработчик, image.load(URL) вместо загрузки нового изображения просто берется последнее загруженное изображение. Раньше я loggerInterceptor видел, что image.load(URL) он выполняет реальные http-вызовы только для первой части держателей.
Вопрос: Как я могу заставить Coil загружать новое изображение для каждого viewholder в RecyclerView, а не только для первой группы видимых держателей?

введите описание изображения здесь

Держатель:

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

Адаптер:

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

Настройка адаптера:

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

Комментарии:

1. Что находится URL внутри binding.image.load(URL) ? как вы получаете URL ? можете ли вы добавить его с вопросом

2. @ADM, готово. При каждом новом запросе этот же URL-адрес предоставляет одно случайное изображение.

3. Значит, вы https://loremflickr.com/200/200/ каждый раз вызываете загрузку и предоставляете случайные изображения? если это то, что ты имеешь в виду. тогда вам нужно отключить кэш в Coil. Проверьте их документацию, чтобы отключить кеш.

4. Это плохой подход. Вся идея использования загрузчика изображений заключается в сохранении кэша. Я думаю, что с вашей логикой случайного изображения что-то не так. Я никогда не использовал Coil , поэтому не могу это комментировать. можете ли вы попробовать добавить placeholder изображение.

5. @ADM также решил эту проблему. только что добавлен memoryCacheKey(), так что теперь он знает, как отличить новое содержимое от сохраненного. Вы полностью сделали мой день, большое вам спасибо. Не давая прямых ответов, а подталкивая в правильном направлении. Вот несколько интересных вещей, может быть, вам это понравится youtube.com/watch?v=4aFGuKwF2icamp;ab_channel=DanHate666 м/