Android開發中經常使用的ListView列表的優化方式ViewHolder

  在Android開發中不免會遇到大量的數據加載到ListView中進行顯示,java

而後其中最重要的數據傳遞橋樑Adapter適配器是經常使用的,隨着市場的需android

求變化ListView'條目中的內容是愈來愈多這就須要程序員來自定義適配器,程序員

而關鍵的就是適配器的優化問題,適配器沒有優化好每每就會形成OOMide

(內存溢出)或者是滑動卡頓之類的問題,接下來我就給你們介紹一種常優化

用的Adapter優化方法this

  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的view
115              * 來獲得item中各個控件的實例
116              *
117              * @param view
118              */
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中自定義樣式的文章spa

相關文章
相關標籤/搜索