问题描述
请帮帮我。
我使用 Coil 在网格 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 为 recyclerView 中的每个 viewholder 下载新图片,而不仅仅是第一组可见的持有者?
持有人:
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)
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)