Glide recyclerview загрузка дублированного изображения
У меня есть recyclerview
с diffutil
, Уже я использую Glide
загружать изображения внутри ImageViews
,
на onBindViewHolder
Я называю свою функцию это называется loadImage(holder.view,item)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = getItem(position)
onLoadImage(holder.view, item)
}
В моем loadImage я загружаю изображение внутри представления.
private fun loadImage(view: View, item: MyItemModel) {
Timber.i("load item's image id: ${item.id} image is: ${item.image}")
Glide.with(context)
.asDrawable()
.load(item.image)
.into(view.main_image)
}
Это работает хорошо, но когда вы загружаете изображение в первый раз, я пролистываю список, и изображения отображаются так:
Таким образом, изображения дублируются, но последние два изображения отличаются. Это происходит, только если я быстро проведу пальцем во время загрузки. Журнал:
I/MyListAdapter: load image into : 6 image is: [B@25d0674
I/MyListAdapter: load image into : 7 image is: [B@e64ced4
I/MyListAdapter: load image into : 8 image is: [B@b384734
Это пользовательский вид. Контекст - это контекст представления.
Таким образом, изображения разные. В чем проблема?
Любое предложение?
5 ответов
Я знаю, что уже поздно, но надеюсь, что это кому-нибудь поможет. Переопределите эти два метода в вашем адаптере.
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
Попробуйте очистить изображение перед загрузкой нового в свой loadImage
метод:
view.main_image.setImageBitmap(null)
Glide.with(...)
Если ваше изображение может быть получено как с локального, так и с удаленного URL-адреса.
Есть вероятность, что вы получите дубликат изображения. По сути, ваш локальный образ может быть переопределен удаленным образом.
Затем перед загрузкой локального чертежа вы должны отменить процесс загрузки, который произошел на этом изображении.
Вы можете найти пример здесь https://bumptech.github.io/glide/doc/getting-started.html.
public void onBindViewHolder(ViewHolder holder, int position) {
if (isLoadingRemoteImage) {
...
} else {
Glide.with(context).clear(holder.imageView);
holder.imageView.setImageDrawable(specialDrawable);
}
}
Glide.with(context)
.setDefaultRequestOptions(RequestOptions().frame(1000000L)) // Set the time in microseconds
.load(videoPath)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
Это точно сработает
override fun onBindViewHolder(holder: CategoriesViewHolder, position: Int){
Glide.with(context)
**.setDefaultRequestOptions(RequestOptions().frame(1000000L)) //add
this line only if you are using gif**
.load(imgList[position])
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(holder.imageview)
//Glide.with(holder.itemView).load(imgList[position]).into(holder.imageview)
}
этот код гарантирует, что загруженное изображение не сохраняется в памяти (skipMemoryCache(true)) или на диске (diskCacheStrategy(DiskCacheStrategy.NONE)), поэтому каждый раз оно извлекается из источника заново.