这里是重写了adapter
public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                if(convertView==null){
                        holder=new NewsHolder();
                        convertView=inflater.inflate(R.layout.newitem, null);
                        holder.img=(ImageView)convertView.findViewById(R.id.img);
                        holder.title=(TextView)convertView.findViewById(R.id.title);
                        holder.content=(TextView)convertView.findViewById(R.id.content);
                        convertView.setTag(holder);
                        
                }else{
                        holder=(NewsHolder)convertView.getTag();
                }
                holder.img.setId(position);
                holder.img.setTag(this.imgPath[position]);
                info=newsList.get(position);
                if(info !=null){
                        holder.title.setText(info.getTitle());
                        holder.content.setText(info.getContent());
                        
                }
                               //这里是异步调用图片
                new CanvasImageTask().execute(holder.img);
                holder.img.setDrawingCacheEnabled(true);                return convertView;
        }这是异步类
public class CanvasImageTask extends AsyncTask<ImageView, Void, Bitmap> {
        private ImageView gView;        protected Bitmap doInBackground(ImageView... views) {
                Bitmap bmp = null;
                ImageView view = views[0];
                // 根据iconUrl获取图片并渲染,iconUrl的url放在了view的tag中。
                if (view.getTag() != null) {
                        try {
                                URL url = new URL(view.getTag().toString());
                                HttpURLConnection conn = (HttpURLConnection) url
                                                .openConnection();
                                conn.setDoInput(true);
                                conn.connect();
                                InputStream stream = conn.getInputStream();
                                bmp = BitmapFactory.decodeStream(stream);
                                stream.close();
                        } catch (Exception e) {
                                Log.v("img", e.getMessage());
                                return null;
                        }
                }
                this.gView = view;
                return bmp;
        }        protected void onPostExecute(Bitmap bm) {
                if (bm != null) {
                                                //此处更新图片
                        this.gView.setImageBitmap(bm);
                        this.gView = null;
                }
        }
我想问的是,adapter里的getView是当信息的显示超过一个屏幕的高度时,在listView中向下滑动鼠标或拖曳时都会触发getView加载信息,这样会导致了重复执行new CanvasImageTask().execute(holder.img);从而重复加载获取网络图片,大大增加了上网流量和浏览速度,该怎么解决这个问题呢?

解决方案 »

  1.   

    我用的解决办法是用一个Map<Integer,Bitmap>
    cavasImageTask取到图片后把图片放到map里
    键是listivew的position。
    在getView里面先判断map里是否有,如果有直接拿,没有的话再asyncTask.execute.
      

  2.   

    1楼的方法是可以,但是还是有点小问题,就是一开始的时候往下拉,下面的图片还没显示出来,如果上面的图片先显示出来的,下面的list就会先显示上面的图片,等到自己的图片下好了,再显示回自己的图片
      

  3.   

    那是因为你的NewsHolder的问题吧,
    直接convertView.getTag()的时候得到的是前面显示过的,已经有图片了。
    所以你应该
    if(map.containsKey(position+"")){
    holder.img.setimagebitmap(map.get(position));
    }else{
    holder.img.setimagebitmap(null);
    }
      

  4.   

    恩恩,谢谢tonyzzp的热心回答啦~
    是我一时疏忽了,问题解决啦
      

  5.   

    感觉都没有解决问题啊,楼主的问题是下拉的太快的时候,通过getView会发出太多请求,这些请求都是新的图片的请求,用Map或者list缓存没有任何帮助啊,中间滑动太快的图片请求还是会发送出去啊。
    我现在也碰到了这个问题,不知道怎么解决,现在的思路就是滑动太快或者拖拽时不发送图片请求,但是这个不知道怎么实现。