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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!