Android開發中常用的ListView列表的最佳化方式ViewHolder

來源:互聯網
上載者:User

標籤:技術分享   this   控制項   view設定   select   time()   滑動   alt   開發   

  在Android開發中難免會遇到大量的資料載入到ListView中進行顯示,

然後其中最重要的資料傳遞橋樑Adapter適配器是常用的,隨著市場的需

求變化ListView‘條目中的內容是越來越多這就需要程式員來自訂配接器,

而關鍵的就是適配器的最佳化問題,適配器沒有最佳化好往往就會造成OOM

(記憶體溢出)或者是滑動卡頓之類的問題,接下來我就給大家介紹一種常

用的Adapter最佳化方法

  1   /**  2      * list View的適配器  3      */  4     class Adapter extends BaseAdapter {  5   6         /**  7          * 返回item條目總數  8          *  9          * @return 10          */ 11         @Override 12         public int getCount() { 13             return newsInfos.size(); 14         } 15  16         /** 17          * 次方法返回的是Object類型的,可以返回任意類型的資料 18          * 我這裡返回的是一個java ben集合中的一個ben對象 19          * 20          * @param position 21          * @return 22          */ 23         @Override 24         public Object getItem(int position) { 25             return newsInfos.get(position); 26         } 27  28         /** 29          * 返回item所在的位置,從0開始計數的 30          * 31          * @param position 32          * @return 33          */ 34         @Override 35         public long getItemId(int position) { 36             return position; 37         } 38  39         /** 40          * 定義一個ViewHolder對象 41          */ 42         ViewHolder holder; 43  44         /** 45          * 此方法返回一個item的View 46          * 47          * @param position    listView中item的位置 48          * @param convertView 這個convertView其實就是最關鍵的部分  原理上講 當ListView滑動的過程中 會有item被滑出螢幕 而不再被使用 這時候Android會回收這個條目的view 這個view也就是這裡的convertView 49          *                    當item1被移除螢幕的時候 我們會重新new一個View給新顯示的item_new 而如果使用了這個convertView 我們其實可以複用它 這樣就省去了new View的大量開銷 50          * @param parent      parent是item的view的父視圖,調整item寬高用的 不常用 51          * @return 52          */ 53         @Override 54         public View getView(int position, View convertView, ViewGroup parent) { 55  56             if (convertView == null) { 57                 convertView = View.inflate(HomeActivity.this, R.layout.list_item, null); 58             } 59              60             //先都與最佳化沒多大關係了都是設定每個控制項的資料 61             holder = getHolder(convertView); 62             holder.com.setText(newsInfos.get(position).getComment() + "次瀏覽"); 63             holder.type.setText(getType(newsInfos.get(position).getType())); 64             holder.time.setText(newsInfos.get(position).getTime()); 65             holder.desc.setText(newsInfos.get(position).getDescription()); 66             holder.title.setText(newsInfos.get(position).getTitle()); 67             String timeId = newsInfos.get(position).getId(); 68             String stats = SharePrefenceUtils 69                     .getInstance(HomeActivity.this).getStr("new_item" + timeId, ""); 70             if (TextUtils.equals(timeId, stats)) { 71                 holder.stats.setText("已讀"); 72                 holder.stats.setSelected(true); 73             } else { 74                 holder.stats.setText("未讀"); 75                 holder.stats.setSelected(false); 76             } 77             holder.icon.setImageUrl(newsInfos.get(position).getImage(), null); 78             return convertView; 79         } 80  81         /** 82          * 得到ViewHolder 83          * 84          * @param view 85          * @return 86          */ 87         public ViewHolder getHolder(View view) { 88             //通過傳遞進來的view 的getTag方法獲得holder 89             ViewHolder holder = (ViewHolder) view.getTag(); 90             if (holder == null) { 91                 //如果傳遞進來的View沒有設定Tag,就重新new一個holder執行個體 92                 holder = new ViewHolder(view); 93                 //給傳遞進來的view設定tag 94                 view.setTag(holder); 95             } 96             //返回holder 97             return holder; 98         } 99 100         /**101          * 定義一個ViewHolder類102          */103         class ViewHolder {104             //下面定義的屬性控制項都是listView中item裡有的控制項105             TextView title;106             TextView desc;107             TextView time;108             TextView type;109             TextView com;110             TextView stats;111             SmartImageView icon;112 113             /**114              * 建立該類的執行個體時需要傳入item的view115              * 來得到item中各個控制項的執行個體116              *117              * @param view118              */119             public ViewHolder(View view) {120                 title = (TextView) view.findViewById(R.id.tv_title);121                 icon = (SmartImageView) view.findViewById(R.id.iv_icon);122                 desc = (TextView) view.findViewById(R.id.tv_desc);123                 time = (TextView) view.findViewById(R.id.tv_time);124                 type = (TextView) view.findViewById(R.id.tv_type);125                 com = (TextView) view.findViewById(R.id.tv_com);126                 stats = (TextView) view.findViewById(R.id.tv_stats);127             }128         }129     }

最後給大家瞧瞧我實現的把,如果有對item樣式感興趣的朋友們請在下方留言我會再寫一篇關於android中自訂樣式的文章

Android開發中常用的ListView列表的最佳化方式ViewHolder

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.