毛孩市集 (友站連結)

2011年5月24日 星期二

在ListView顯示網路圖片+快取

這篇的重點是在ListView裡顯示網路圖片
並且加到cache裡,如果還在下載就顯示ProgressBar


1. 

2.


3. 

4.


先自訂一個類別GetWebImg
private HashMap<String, Bitmap> picmap = new HashMap<String, Bitmap>();
//宣告一個HashMap用來存網址及圖片用的


public boolean IsCache(String u){//判斷是否有暫存
        return picmap.containsKey(u);
}


public boolean IsDownLoadFine(String u){//判斷圖片是否下載成功
        return (picmap.get(u)!= null)?true:false;
}


public boolean IsLoading(String u){//判斷圖片是否下載中
        return (IsCache(u)==true && IsDownLoadFine(u)==false)?true:false;
}


public void LoadUrlPic(final String u,final Handler h) {
        picmap.put(u,null);//放到暫存的空間
        new Thread(new Runnable() {//新開一個執行緒去下載
        @Override
        public void run() {
                Bitmap temp = LoadUrlPic(u);//下載圖片的自訂函數
                if (temp == null){//如果下載失敗
                        picmap.remove(u);//移出暫存空間
                        h.sendMessage(h.obtainMessage(DOWNLOAD_ERROR,null));
                }else{
                        picmap.put(u, temp);//存起來
                        h.sendMessage(h.obtainMessage(DOWNLOAD_FINISH,temp));
                }
        }
        }).start();
}


接下來是自訂的BaseAdapter
宣告public ArrayList<String[]> data;//陣列是存網址及文字說明
宣告Handler h = new Handler(){//告訴BaseAdapter資料已經更新了
        @Override
        public void handleMessage(Message msg) {
                notifyDataSetChanged();
                super.handleMessage(msg);
        }
};


@Override
public View getView(final int position, View view, ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
        view = mInflater.inflate(R.layout.main_content, null);
        holder = new ViewHolder();
        holder.text = (TextView) view.findViewById(R.id.main_content_text);
        holder.pic = (ImageView) view.findViewById(R.id.main_content_pic);
        holder.wait = (ProgressBar) view.findViewById(R.id.main_content_wait);
        view.setTag(holder);
} else {
        holder = (ViewHolder) view.getTag();
}
holder.text.setText(data.get(position)[0]);//顯示文字說明
holder.pic.setVisibility(View.INVISIBLE);
holder.wait.setVisibility(View.VISIBLE);
if (ImgCache.IsCache(data.get(position)[1]) == false){//如果圖片沒有暫存
        ImgCache.LoadUrlPic(data.get(position)[1],h);//下載圖片
}else if (ImgCache.IsDownLoadFine(data.get(position)[1]) == true){//如果已經下載完成,就顯示圖片並把ProgressBar隱藏
        holder.pic.setImageBitmap(ImgCache.getImg(data.get(position)[1]));
        holder.wait.setVisibility(View.GONE);
        holder.pic.setVisibility(View.VISIBLE);
}else{
        //這裡是下載中,什麼事都不用做
}
return view;
}


以上是部份主要的程式碼
完整的程式碼在↓
http://uploadmirrors.com/download/1CLSSBJP/ListView_WebImg.zip


4 則留言:

  1. 請問版主能記這個壓縮檔給我嗎???

    因為檔案已過期!!!

    我們專題需要,能否幫幫忙QQ

    回覆刪除
  2. 您好我想請教一下歐! 目前我想要知道的是,是否可以加上OnItemClickListener的方法!這樣我才能知道哪一個被點選到,若是能夠使用,寫法應該撰寫呢?

    回覆刪除
  3. 請問可以將原始檔案寄給我嗎?? 謝謝
    willy0922@gmail.com

    回覆刪除