android - GridView中用universal-image-loader异步加载本地图片出现图片错乱现象,求大神相助,已经想了2天了
PHP中文网
PHP中文网 2017-04-17 13:55:24
[Android讨论组]

在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 = "";
    }

};
PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(1)
PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号