首页 > GridView中用universal-image-loader异步加载本地图片出现图片错乱现象,求大神相助,已经想了2天了

GridView中用universal-image-loader异步加载本地图片出现图片错乱现象,求大神相助,已经想了2天了

在getView中异步加载本地图片就会出现错乱,但是用个list保存holder就不会,真搞不懂了


BaseAdapter adapter = new BaseAdapter() {

    public int getCount() {

        return mData.size() + 1;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return position;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            holder.image = (ImageView) mInflater.inflate(R.layout.image_make_house, parent, false);
            holderList.add(holder);
            holder.image.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        //如果是最后一张图片
        if (position == getCount() - 1) {
            //数量是否是最大值+1
            if (getCount() == (PHOTO_MAX_COUNT + 1)) {
                //item设置不可见时不能触发OnItemClick
                holder.image.setVisibility(View.INVISIBLE);

            } else {
                holder.image.setVisibility(View.VISIBLE);
                holder.image.setImageResource(R.drawable.add_img);
                holder.uri = "";
            }

            //不是最后一张
        } else {

            holder.image.setVisibility(View.VISIBLE);
            PhotoData photoData = mData.get(position);
            Uri data = photoData.uri;
            holder.uri = data.toString();
            
            final ImageView img = holder.image;

            ImageLoader.getInstance().loadImage(data.toString(), mSize, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                  
                  //这样写就会出现图片错位
                    img.setImageBitmap(loadedImage);
                    
                }
            });
        }

        return holder.image;
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        //图片数量大于1则显示,只有1张或者没有则不显示
        gridView.setVisibility(getCount() >= 1 ? View.VISIBLE : View.GONE);
    }

    class ViewHolder {
        ImageView image;
        String uri = "";
    }

};

BaseAdapter adapter = new BaseAdapter() {

    //这样就不会出错了
    ArrayList<ViewHolder> holderList = new ArrayList<>();

    public int getCount() {

        return mData.size() + 1;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return position;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            holder.image = (ImageView) mInflater.inflate(R.layout.image_make_house, parent, false);
            holderList.add(holder);
            holder.image.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        //如果是最后一张图片
        if (position == getCount() - 1) {
            //数量是否是最大值+1
            if (getCount() == (PHOTO_MAX_COUNT + 1)) {
                //item设置不可见时不能触发OnItemClick
                holder.image.setVisibility(View.INVISIBLE);

            } else {
                holder.image.setVisibility(View.VISIBLE);
                holder.image.setImageResource(R.drawable.add_img);
                holder.uri = "";
            }

            //不是最后一张
        } else {

            holder.image.setVisibility(View.VISIBLE);
            PhotoData photoData = mData.get(position);
            Uri data = photoData.uri;
            holder.uri = data.toString();

            ImageLoader.getInstance().loadImage(data.toString(), mSize, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                
                //这样就正常
                    for (ViewHolder item : holderList) {
                        if (item.uri.equals(imageUri)) {
                            item.image.setImageBitmap(loadedImage);
                        }
                    }
                }
            });
        }

        return holder.image;
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        //图片数量大于1则显示,只有1张或者没有则不显示
        gridView.setVisibility(getCount() >= 1 ? View.VISIBLE : View.GONE);
    }

    class ViewHolder {
        ImageView image;
        String uri = "";
    }

};

你可以将每一个图片的URL放入到image的tag中去,在显示这个image之前先判断一下当前的这个URL是不是与你之前存的那个tag是一致的,如果是一致的就不要加载了,但是具体是什么原理,你应该看一下adapter构造的过程。

【热门文章】
【热门文章】