在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