在从Android资源中将图像加载为位图并使用glideV4设置ImaegView的同时复制图像

时间:2019-01-23 07:03:45

标签: android android-glide android-assets bitmapdrawable diskcache

我尝试从资产中检索位图,然后尝试使用asBitmap()滑行来加载Horizo​​ntal Recyclerview图像列表。我得到重复的图像和不匹配的图像(加载错误的图像代替所需的图像)。下面的屏幕截图显示了笔记本电脑和手机已加载相同的位图,并且固件和总线加载了错误的位图 Here laptop and Mobiles have same bitmap loaded and Footware and Bus has wrong bitmap loaded 我使用.skipMemoryCache(true)删除了滑动缓存后,效果很好。

我想解决同样的问题,想要使用滑行缓存加载图像。

尝试了以下在页面中建议的要点: Glide recyclerview loading duplicate image 1)我添加了palceholder。 2)清除位图-> Glide.with(context).clear(holder.imgcat); 或使用holder.imgcat.setImageBitmap(null); 3)skipMemoryCache(true)运作良好,但需要缓存才能加载图像。

InputStream selectedInputStream = Application.get().getAssets().open(ImageSaver.selectedAssets + "/" + mValues.get(position).getImage_url());
                Drawable selectedImagesDrawable = Drawable.createFromStream(selectedInputStream, null);
                Bitmap selectedicon = ((BitmapDrawable) selectedImagesDrawable).getBitmap();
                if(selectedInputStream != null) {
                    try {
                        selectedInputStream.close();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
                GlideApp.with(context)
                        .asBitmap()
                        .load(selectedicon)
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .error(R.drawable.placeholder)
                        .placeholder(R.drawable.placeholder)
                        .into(holder.imgcat);

设置时我得到了重复的图像和不匹配的图像(加载错误的图像代替所需的图像) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)或                         .diskCacheStrategy(DiskCacheStrategy.ALL)

skipMemoryCache(true)运作良好,但需要缓存才能加载图像

1 个答案:

答案 0 :(得分:1)

此问题有时在recyclerviews中发生 recyclerviews使用相同的ViewHolders来显示其列表项。 因此有可能在一个ImageView上调用多个请求 您的观看者同时显示。对此的一种解决方法是停止对该ImageView已经发生的任何其他Glide请求。

//in your onBindViewHolder 
fun onBindViewHolder( holder:ViewHolder ,position:Int){
   //call this to clear previous requests
   Glide.with(context).clear(holder.imageView)
   //then make new request
   Glide.with(context).load(items[position].url).into(holder.imageview)
   //other codes
}