MY_MySign 2016-10-16 03:59 采纳率: 33.3%
浏览 1123

一个关于解决图片的错位闪动问题出现的bug

为了解决图片的错位闪动我给每个条目的ImageView设置的url为标记,也设置了一个默认图片
获取对应ImageView的Bitmap的方式为:先从缓存中根据url查找,若找到,则通过标记找到ImageView给它设置bitmap;若找不到,开启一个线程下载图片,并通过二次采样获取bitmap,存入缓存并通过标记找到ImageView给它设置图片
出现的bug是:所有图片的第一次加载均正常,如条目A,当我往下滑,把A划出屏幕以后,再向上滑,A的图片就成了我设置的默认图片,而且不会更新为其对应url的图片
代码如下:

 //            解决图片的闪动错位问题
                holder.ivPic.setImageResource(R.drawable.e);
                holder.ivPic.setTag(url);

//                             先从缓存中获取图片
                    if (lruCacheUtils.getBitmapByUrl(url) != null) {
                    ImageView iv = (ImageView) viewGroup.findViewWithTag(url);
                    if(iv != null){
                        iv.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));
                    }
//                        holder.ivPic.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));

                } else {
                    new Thread() {
                        @Override
                        public void run() {
                            super.run();
                            byte[] data = OkHttpUtils.getByteArrayByUrl(url);
                            if (data != null) {
                                final Bitmap bitmap = BitmapUtils.getOptionBitmapByByteArray(data);

//                            将bitmap存入缓存中
                                if (bitmap != null) {
                                    lruCacheUtils.saveBitmapByUrl(url, bitmap);
                                }

//                            动态更新ui,应该在主线程中
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        ImageView iv = (ImageView) viewGroup.findViewWithTag(url);
                                        if(iv != null){
                                            iv.setImageBitmap(bitmap);
                                        }
                                    }
                                });
                            }
                        }
                    }.start();

后来我把从缓存中设置图片得方式改为,直接通过viewholder(管理条目中的view)Imageview设置图片,bug就好了,但我不明白为什么这样

//                             先从缓存中获取图片
                    if (lruCacheUtils.getBitmapByUrl(url) != null) {
//                    ImageView iv = (ImageView) viewGroup.findViewWithTag(url);
//                    if(iv != null){
//                        iv.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));
//                    }
                        holder.ivPic.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));

  • 写回答

1条回答 默认 最新

  • devmiao 2016-10-16 04:07
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题