GridView、ListView数据更新图片闪烁问题

新功能是选择图片上传,选择完图片在上传前可以对已选择的图片进行删除。删除图片后,调用notifyDataSetChanged 通知UI数据更改。
是用Imageloader展示图片。
因为执行notifyDataSetChanged 后,GridView、ListView重新执行了getView 方法,getView 图片又重新加载。所以会出现图片会有闪烁。
解决方法是给图片setTag ,在getview里面,判断要加载的图片的tag是否相同。
修改之前:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context)
            .inflate(R.layout.item_car_image_upload,
                    parent, false);
            holder = new ViewHolder();
            holder.image = (ImageView) convertView
                    .findViewById(R.id.item_grida_image);
            holder.delete= (ImageView) convertView
                    .findViewById(R.id.delete_icon_image);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
    //notifyDataSetChanged后,执行getView,会重新加载闪烁
        ImageLoader.getInstance().displayImage(
        imageInfoList.get(position).toString(), holder.image);

        return convertView;
    }

修改之后

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
        .inflate(R.layout.item_car_image_upload,
               parent, false);
            holder = new ViewHolder();
            holder.image = (ImageView) convertView
                    .findViewById(R.id.item_grida_image);
            holder.delete= (ImageView) convertView
                    .findViewById(R.id.delete_icon_image);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        //判断tag,决定是否重新加载
        if (imageInfoList.get(position).toString()
        .equals(holder.image.getTag())) {         
        }
         else {    
         //加载图片                                               ImageLoader.getInstance().displayImage(       imageInfoList.get(position).toString(),holder.image);
        //使用图片的资源地址url或者本地地址作为tag                holder.image.setTag(imageInfoList.get(position).toString());
     }      
        return convertView;
    }

作为viewholder的tag的内容,其实不一定要是图片的url,之前因为图片重复,url可能重复,使用数据源里面的id作为tag更准确一些。

类似于这样,使用Car_id作为tag,决定数据是否需要加载

 if ((viewHolder.image_app_small.getTag()!=null&&overseaCarInfos.get(position)!=null&&
        overseaCarInfos.get(position).getCar_id()!=null&&overseaCarInfos.get(position).getCar_id().equals(viewHolder.image_app_small.getTag())
        )) {

        } else {
            // 如果不相同,就加载。现在在这里来改变闪烁的情况
            ImageLoader.getInstance().displayImage(overseaCarInfos.get(position).getImage_url_app_small(), viewHolder.image_app_small);

            viewHolder.image_app_small.setTag(overseaCarInfos.get(position).getCar_id());
            viewHolder.car_price.setText(overseaCarInfos.get(position).getPrice());
            viewHolder.overease_car_name.setText(overseaCarInfos.get(position).getName_cn());
        }

你可能感兴趣的:(Android)