posts - 189,comments - 115,trackbacks - 0

          ListView的Adapter的作用如下圖所示:

          Adapter的作用就是ListView界面與數據之間的橋梁,當列表里的每一項顯示到頁面時,都會調用Adapter的getView方法返回一個View。想過沒有? 在我們的列表有1000000項時會是什么樣的?是不是會占用極大的系統資源?

          先看看下面的代碼:

          public View getView(int position, View convertView, ViewGroup parent) {
          View item = mInflater.inflate(R.layout.list_item_icon_text, null);
          ((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
          ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
          (position & 1) == 1 ? mIcon1 : mIcon2);
          return item;
          }

          怎么樣?如果超過1000000項時,后果不堪設想!您可千萬別這么寫!

          我們再來看看下面的代碼:

          public View getView(int position, View convertView, ViewGroup parent) {
          if (convertView == null) {
          convertView = mInflater.inflate(R.layout.item, null);
          }
          ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
          ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
          (position & 1) == 1 ? mIcon1 : mIcon2);
          return convertView;
          }

          怎么樣,上面的代碼是不是好了很多?系統將會減少創建很多View。性能得到了很大的提升。

          還有沒有優化的方法呢? 答案是肯定的:

          public View getView(int position, View convertView, ViewGroup parent) {
          ViewHolder holder;
          if (convertView == null) {
          convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
          holder = new ViewHolder();
          holder.text = (TextView) convertView.findViewById(R.id.text);
          holder.icon = (ImageView) convertView.findViewById(R.id.icon);
          convertView.setTag(holder);
          } else {
          holder = (ViewHolder) convertView.getTag();
          }
          holder.text.setText(DATA[position]);
          holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
          return convertView;
          }
           
          static class ViewHolder {
          TextView text;
          ImageView icon;
          }

          怎么樣?會不會又給您的系統帶來很大的提升呢?看看下面三種方式的性能對比圖您就知道了!

          本文是Google I/O 2009 Romain Guy 所講的內容,這里只做簡單介紹,相信一看代碼就能看懂!有問題請留言!

          posted on 2010-08-17 17:13 MEYE 閱讀(2922) 評論(1)  編輯  收藏

          FeedBack:
          # re: Android開發之ListView 適配器(Adapter)優化
          2010-11-25 13:39 | 李聰
          您好,我剛接觸Android沒多久,前幾天面試也被問到這個問題,今天看到您這些東西很受用,謝謝,不過有個問題就是這個getView()方法寫在哪里呢  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 海丰县| 准格尔旗| 嘉禾县| 阜宁县| 和顺县| 吉林省| 二手房| 新干县| 大悟县| 温泉县| 宜兰市| 磴口县| 偏关县| 舒兰市| 化德县| 西城区| 天水市| 巨鹿县| 嘉义市| 伽师县| 隆尧县| 新田县| 富裕县| 和田市| 盈江县| 渝中区| 姜堰市| 白河县| 兴城市| 曲水县| 呼玛县| 益阳市| 商洛市| 岳西县| 钟山县| 冀州市| 浮山县| 安义县| 星子县| 鹰潭市| 辽源市|