具体是什么问题,可以展开说说吗?我的理解上,异步下载图片,在下载完成前,持有的imageview所在item可能已被复用到另一个位置了,这时下载完成了再去设置此图片会造成错位。但我觉得UIL应该会去处理这种情况

解决方案 »

  1.   

    这个显示错乱是指某行item显示了不属于该行item的图片。
    比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,第14行显示了第2行的View,这时之前的图片加载结束,就会显示在第14行,造成错乱。
      

  2.   

    我现在就是在用UIL,还是存在这个问题,需要做什么设置吗
      

  3.   

    现在没有自己处理,因为觉得UIL应该会考虑这种情况,不知道是否需要设置特定的参数
      

  4.   

    看了so上nostra本人的回答,似乎是在设置里需要加上resetViewBeforeLoading,但我加了貌似仍然没用
    http://stackoverflow.com/questions/14080117/universal-image-loader-wrong-bitmaps-are-attached-to-imageview
      

  5.   


    showStubImage  试试这个呢
      

  6.   

    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if(convertView == null){
    convertView = mInflater.inflate(R.layout.dish_item, null);
    holder = new ViewHolder();
    holder.mainPic = (ImageView) convertView.findViewById(R.id.main_pic);
    holder.subPic1 = (ImageView) convertView.findViewById(R.id.sub_pic1);
    holder.subPic2 = (ImageView) convertView.findViewById(R.id.sub_pic2);
    holder.dishName = (TextView) convertView.findViewById(R.id.dish_name);
    holder.dishComment = (TextView) convertView.findViewById(R.id.dish_comment);
    convertView.setTag(holder);
    }

    holder = (ViewHolder) convertView.getTag();
    holder.dishComment.setText(String.format(getResources().getString(R.string.comment_count), mDishs.get(position).comments));
    holder.dishName.setText(mDishs.get(position).name);

    holder.mainPic.setImageResource(R.color.default_color);
    holder.subPic1.setImageResource(R.color.default_color);
    holder.subPic2.setImageResource(R.color.default_color); int len = mDishs.get(position).images.length;

    if(len > 0){
    holder.mainPic.setTag(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[0]);
    displayImage(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[0], holder.mainPic, options);


    if(len > 1) {
    holder.subPic1.setTag(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[1]);
    displayImage(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[1], holder.subPic1, options);


    if(len > 2){
    holder.subPic2.setTag(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[2]);
    displayImage(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[2], holder.subPic2, options);


    return convertView;
    }private void displayImage(String url, final ImageView imageView, DisplayImageOptions options){
    ImageLoader.getInstance().loadImage(url, options, new ImageLoadingListener() {

    @Override
    public void onLoadingStarted(String imageUri, View view) {
    imageView.setTag(imageUri);
    }

    @Override
    public void onLoadingFailed(String imageUri, View view,
    FailReason failReason) {

    }

    @Override
    public void onLoadingComplete(final String imageUri, final View view, final Bitmap loadedImage) {
    final String tag = (String) imageView.getTag();
    mHandler.post(new Runnable() {

    @Override
    public void run() {
    if(imageUri.equals(tag)){
    imageView.setImageBitmap(loadedImage);
    imageView.setTag("");
    }
    }
    });

    }

    @Override
    public void onLoadingCancelled(String imageUri, View view) {

    }
    });
    }

    DisplayImageOptions options = new DisplayImageOptions.Builder()
    .cacheInMemory(true)
    .cacheOnDisc(true)
    .showImageForEmptyUri(R.color.default_color)
    .showImageOnFail(R.color.default_color)
    .showStubImage(R.color.default_color)
    .showImageOnLoading(R.color.default_color)
    .imageScaleType(ImageScaleType.EXACTLY)
    .bitmapConfig(Bitmap.Config.RGB_565)
    .resetViewBeforeLoading()
    .build();代码实现如上,我后来在imageview里设置了url作为tag,下载完成后去判断,但是仍然没规避问题
    showStubImage  试试这个呢
      

  7.   


    showStubImage  试试这个呢showStubImage(R.color.default_color)
    这个里面换成图片的资源试试呢?R.drawable.xxx
      

  8.   

    换成图片还是不行,比较奇怪了,但是可以肯定错位的原因是由于复用了view导致的,不知道为何加了tag没有起到作用
    showStubImage(R.color.default_color)
    这个里面换成图片的资源试试呢?R.drawable.xxx
      

  9.   

    最终通过记录position而非url的方式解决了这个问题,就是在tag里设置position,下载完成后再去判断。但是还是不太明白为什么不可以用url做标记。
      

  10.   

    我记得用异步加载 也会出现错位问题 最后用了一个flag标识 就搞定了
      

  11.   

    解决的办法是:
    imageView.setTag(url);在load的时候取这个imageView:public PhoneListAdapter(PhoneListActivity activity,ArrayList<CTPhone> list,ListView listView){}Bitmap b = CTChannelApplication.loader.loadBitmap(totalUrl, new ImageCallback(){
    public void imageLoaded(Bitmap bitmap, String imageUrl) {
    ImageView imageView = (ImageView)listView.findViewWithTag(imageUrl);
    if(bitmap != null && imageView != null){
    imageView.setImageBitmap(bitmap);
    }
    }
    });
    if(b != null){
    imageView.setImageBitmap(b);
    }else{
    imageView.setImageBitmap(defaultBmp);
    }