一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

android ListView顯示網(wǎng)絡(luò)圖片

 dengxianzhi 2010-12-17
android ListView顯示網(wǎng)絡(luò)圖片

android ListView顯示網(wǎng)絡(luò)圖片

研究了android兩個(gè)禮拜,稍微有了點(diǎn)眉目,開(kāi)始正式幫公司開(kāi)發(fā)應(yīng)用的時(shí)候,發(fā)現(xiàn)ListView沒(méi)有現(xiàn)成的顯示網(wǎng)絡(luò)圖片的類或方法,網(wǎng)上查了查也沒(méi)找到好的解決方法。心一橫,自己研究吧,現(xiàn)在把我的解決辦法和大家分享一下。

使用ListView的方法就不在此介紹了,google一下都是的。

第一步:分析api

使用ListView都需要使用Adapter,而api中的adapter都繼承自BaseAdapter,所以第一反應(yīng)就是自己實(shí)現(xiàn)一個(gè)繼承自 BaseAdapter的adapter,但是BaseAdapter還是屬于高度抽象的基類,所以實(shí)現(xiàn)起來(lái)還是還是有點(diǎn)難度的。此時(shí)作為初學(xué)者的你(當(dāng) 然我也是啦)應(yīng)該最熟悉的是SimpleAdapter了吧,而且SimpleAdapter也可以實(shí)現(xiàn)在ListView顯示圖片,但是就是不能顯示網(wǎng) 絡(luò)圖片,只能顯示在drawalbe中定義過(guò)的圖片。所以就想,我是否可以改寫(xiě)SimpleAdapter的類,在它實(shí)例化drawalbe中圖片時(shí),我 替換成我自己 的顯示網(wǎng)絡(luò)圖片的方法呢?答案是肯定的?。ㄏ氆@取android的源碼,可以查看我的另一篇文章http://hulefei29./blog/615016

第二步:源碼分析

經(jīng)過(guò)查看源碼SimpleAdapter發(fā)現(xiàn),顯示每個(gè)item視圖都是通過(guò)調(diào)用(int position, View convertView, ViewGroup parent)方法來(lái)實(shí)現(xiàn)的

Java代碼
  1. /**
  2.       * @see android.widget.Adapter#getView(int, View, ViewGroup)
  3.       */  
  4.     public View getView(int position, View convertView, ViewGroup parent) {   
  5.         return createViewFromResource(position, convertView, parent, mResource);   
  6.      }  

在getView(int position, View convertView, ViewGroup parent)中又調(diào)用了SimpleAdapter的私有方法createViewFromResource來(lái)組裝View,在 createViewFromResource中對(duì)SimpleAdapter的參數(shù)String[] from

和int[] to進(jìn)行了組裝,代碼如下:

Java代碼
  1. private View createViewFromResource(int position, View convertView,   
  2.              ViewGroup parent, int resource) {   
  3.          View v;   
  4.         if (convertView == null) {   
  5.              v = mInflater.inflate(resource, parent, false);   
  6.   
  7.             final int[] to = mTo;   
  8.             final int count = to.length;   
  9.             final View[] holder = new View[count];   
  10.   
  11.             for (int i = 0; i < count; i++) {   
  12.                  holder[i] = v.findViewById(to[i]);   
  13.              }   
  14.   
  15.              v.setTag(holder);   
  16.          } else {   
  17.              v = convertView;   
  18.          }   
  19.   
  20.          bindView(position, v);   
  21.   
  22.         return v;   
  23.      }  

在createViewFromResource方法中又有一個(gè)bindView(position, v)方法對(duì)item中的各個(gè)View進(jìn)行了組裝,bindView(position, v)代碼如下:

Java代碼
  1. private void bindView(int position, View view) {   
  2.         final Map dataSet = mData.get(position);   
  3.         if (dataSet == null) {   
  4.             return;   
  5.          }   
  6.   
  7.         final ViewBinder binder = mViewBinder;   
  8.         final View[] holder = (View[]) view.getTag();   
  9.         final String[] from = mFrom;   
  10.         final int[] to = mTo;   
  11.         final int count = to.length;   
  12.   
  13.         for (int i = 0; i < count; i++) {   
  14.             final View v = holder[i];   
  15.             if (v != null) {   
  16.                 final Object data = dataSet.get(from[i]);   
  17.                  String text = data == null ? "" : data.toString();   
  18.                 if (text == null) {   
  19.                      text = "";   
  20.                  }   
  21.   
  22.                 boolean bound = false;   
  23.                 if (binder != null) {   
  24.                      bound = binder.setViewValue(v, data, text);   
  25.                  }   
  26.   
  27.                 if (!bound) {   
  28.                     if (v instanceof Checkable) {   
  29.                         if (data instanceof Boolean) {   
  30.                              ((Checkable) v).setChecked((Boolean) data);   
  31.                          } else {   
  32.                             throw new IllegalStateException(v.getClass().getName() +   
  33.                                     " should be bound to a Boolean, not a " + data.getClass());   
  34.                          }   
  35.                      } else if (v instanceof TextView) {   
  36.                         // Note: keep the instanceof TextView check at the bottom of these   
  37.                         // ifs since a lot of views are TextViews (e.g. CheckBoxes).   
  38.                          setViewText((TextView) v, text);   
  39.                      } else if (v instanceof ImageView) {   
  40.                                if (data instanceof Integer) {   
  41.                              setViewImage((ImageView) v, (Integer) data);                               
  42.                          } else {   
  43.                              setViewImage((ImageView) v, text);   
  44.                          }   
  45.                      } else {   
  46.                         throw new IllegalStateException(v.getClass().getName() + " is not a " +   
  47.                                 " view that can be bounds by this SimpleAdapter");   
  48.                      }   
  49.                  }   
  50.              }   
  51.          }   
  52.      }  


終于找到了對(duì)ViewImage進(jìn)行組裝的代碼了“else if (v instanceof ImageView)”,我們留成功之差一步之遙了!

看到上面茫茫的代碼是不是已經(jīng)頭暈了呢,其實(shí)以上的都是源代碼,我沒(méi)有做過(guò)任何的修改,也不需要修改,只是需要把它從SimpleAdapter中 取出來(lái)進(jìn)行覆蓋,以為他們私有方法,不能用super調(diào)用!到最后終于到你出手的時(shí)候了,你需要重寫(xiě)SimpleAdapter類中的 setViewText方法,SimpleAdapter對(duì)setViewText進(jìn)行了重載,有兩個(gè)方法,代碼如下:

Java代碼
  1. public void setViewImage(ImageView v, int value) {   
  2.      v.setImageResource(value);   
  3. }   
  4.   
  5.   
  6. public void setViewImage(ImageView v, String value) {   
  7.     try {   
  8.          v.setImageResource(Integer.parseInt(value));   
  9.      } catch (NumberFormatException nfe) {   
  10.          v.setImageURI(Uri.parse(value));   
  11.      }   
  12. }  

setViewImage(ImageView v, int value) 你應(yīng)該一看就熟悉了吧,int就是R中的索引值,但是你還看到SimpleAdapter居然還有一個(gè)setViewImage(ImageView v, String value)可以接受String的方法,在往下看就是知道了,如果不是索引,ImageView 也可以接受Uri的值來(lái)設(shè)置圖片,切忌Uri不是Url,所以我們只需要改寫(xiě)一下這個(gè)方法就ok了,代碼如下:

Java代碼
  1. public void setViewImage(ImageView v, String value) {   
  2.          Bitmap bitmap = WebImageBuilder.returnBitMap(value);   
  3.          ((ImageView) v).setImageBitmap(bitmap);   
  4.      }  

我們用Bitmap 來(lái)對(duì)ImageView進(jìn)行設(shè)置,WebImageBuilder.returnBitMap是我自己實(shí)現(xiàn)的獲取網(wǎng)絡(luò)圖片的方法,當(dāng)然google下都是 的,在我下面的源碼中也有,在這里就不多說(shuō)了!說(shuō)到這,我的解釋也就說(shuō)完了,希望可以給你幫助!如果你是不愿意跟著別人思路走的人,希望自己研究出來(lái)的 話,那最后我也拿我的源碼貼上,對(duì)有些朋友來(lái)說(shuō)獲取直接看源碼,理解的更快吧!

最后強(qiáng)調(diào)一下,本文為胡樂(lè)費(fèi)的原創(chuàng),如果要轉(zhuǎn)載的話,希望注明出處!

本文轉(zhuǎn)自: http://hulefei29./blog/616262

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产丝袜美女诱惑一区二区| 日本黄色美女日本黄色| 国产亚洲精品香蕉视频播放| 亚洲一级在线免费观看| 免费亚洲黄色在线观看| 免费大片黄在线观看日本| 欧美亚洲国产日韩一区二区| 国产欧美高清精品一区| 色综合视频一区二区观看| 五月婷婷缴情七月丁香| 国产色第一区不卡高清| 国产欧美性成人精品午夜| 九九久久精品久久久精品| 又黄又爽禁片视频在线观看| 国内尹人香蕉综合在线| 日本高清二区视频久二区| 国产又猛又大又长又粗| 国产乱淫av一区二区三区| 国产一区二区熟女精品免费| 国产亚洲欧美日韩国亚语| 91人人妻人人爽人人狠狠| 日本一本不卡免费视频| 免费在线成人午夜视频| 日韩aa一区二区三区| 亚洲妇女作爱一区二区三区| 夫妻性生活真人动作视频| 国产在线小视频你懂的| 韩日黄片在线免费观看| 国产又大又硬又粗又湿| 国产伦精品一区二区三区精品视频| 日本午夜福利视频免费观看| 亚洲视频在线观看免费中文字幕| 亚洲av专区在线观看| 精品少妇人妻av免费看| 欧美日韩有码一二三区| 麻豆一区二区三区在线免费| 欧美日韩亚洲国产综合网| 国产熟女高清一区二区| 亚洲中文字幕剧情在线播放| 欧美在线观看视频免费不卡| 欧美午夜色视频国产精品|