作者badhabit (習慣壞習慣)
看板AndroidDev
標題[分享] 在ListView顯示網路圖片+快取
時間Thu Apr 21 23:14:33 2011
看到givemepass及sorrel20567兩位的熱心分享
我也來拋磚引玉一下,一樣是跟ListView有關的東西
請先看過以上兩位對ListView的分享文,會比較容易懂
這篇的重點是在ListView裡顯示網路圖片
並且加到cache裡,如果還在下載就顯示ProgressBar
先自訂一個類別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
請大家多指教囉~^^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.160.210.180
1F:推 nowar100:已收錄 04/22 02:09
2F:推 givemepass:這個很厲害啊...可是我的電腦會變亂碼= = 04/22 10:06
3F:→ givemepass:我把程式改成utf-8就好了 :) 04/22 10:07
4F:→ givemepass:請問如果遇到網路慢的圖片 下載超過5秒的怎麼辦? 04/22 10:08
5F:推 rex1135:不好意思想看一下程式碼但是檔案都被砍了 囧> 09/13 21:21
6F:→ rex1135:請問有人有備份嗎? 謝謝! 09/13 21:22
7F:推 rex1135:阿 原來下一篇就有了XD 09/13 21:24