【威哥說】Android開發最注重的是性能。因此一個圖片的加載,一個按鈕功能的實現都關係到最終項目的好與壞。但願每個小夥伴能利用本身的時間充分的學習。只有在不斷的學習中,才能把握更多的資源。網絡
【正文】ide
ListView這個控件幾乎是每一個應用都要用到,因此,咱們必定要注意它的優化,即便你的應用比較簡單,若是listview不優化,一樣會出現oom等問題。 下面總結4條ListView的優化方案: 第一種是convertView的複用: 就是重用convertView,這也是最簡單的一種優化方式,就是在Adapter類的getView方法中經過判斷convertView是否爲null,是的話就須要在建立一個視圖出來,而後給視圖設置數據,最後將這個視圖返回給底層,呈現給用戶;若是不爲null的話,其餘新的view能夠經過複用的方式使用已經消失的條目view,從新設置上數據而後展示出來。 代碼是這樣的:
if (convertView == null){性能
textView = new TextView(mContext); convertView = textView; convertView.setTag(textView);
}else {學習
textView = (TextView)convertView.getTag(); convertView = textView;
}優化
第二種方式是使用ViewHolder(這裏注意,這個名字是個通用名稱,google推薦命名,實際能夠隨意):
第一種優化方式有個缺點,就是每次在findviewById,從新找到控件,而後對控件進行賦值,這樣會減慢加載的速度,其實咱們能夠建立一個內部類ViewHolder,裏面的成員變量和view中所包含的組件個數、類型相同,在convertview爲null的時候,把findviewbyId找到的控件賦給ViewHolder中對應的變量,就至關於先把它們裝進一個容器,下次要用的時候,直接從容器中獲取,這樣findviewbyId效率要高不少。google
代碼是這樣寫的:
@Overridecode
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (null == convertView) { viewHolder = new ViewHolder(); LayoutInflater mInflater = LayoutInflater.from(mContext); convertView = mInflater.inflate(R.layout.item_marker_item, null); viewHolder.name = (TextView) convertView.findViewById(R.id.name); viewHolder.description = (TextView) convertView .findViewById(R.id.description); viewHolder.createTime = (TextView) convertView .findViewById(R.id.createTime); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } MarkerItem markerItem = getItem(position); if (null != markerItem) { viewHolder.name.setText(markerItem.getName()); viewHolder.description.setText(markerItem.getDescription()); viewHolder.createTime.setText(markerItem.getCreateDate()); } return convertView; } private static class ViewHolder { TextView name; TextView description; TextView createTime; } 第三種方式是因爲咱們的列表顯示的數據過多,並且基本都是從網絡獲取,會佔用太多內存,致使內存溢出,因此,使用分段加載。若是數據有1000條,沒有優化過的ListView都是會一次性把數據所有加載出來的,很顯然須要一段時間才能加載出來,咱們不可能讓用戶面對着空白的屏幕等好幾分鐘,那麼這時咱們可使用分段加載,好比先設置每次加載數據10條,當用戶滑動ListView到底部的時候,咱們再加載20條數據出來,而後使用Adapter刷新ListView,這樣用戶只須要等待10條數據的加載時間,這樣也能夠緩解一次性加載大量數據而致使OOM崩潰的狀況。 第四種方式是分頁加載,由於上面第三種方式其實也不能徹底解決OOM崩潰的狀況,雖然咱們在分段中一次只增長10條數據到List集合中,而後再刷新到ListView中去,假若有10萬條數據,若是咱們順利讀到最後這個List集合中仍是會累積海量條數的數據,仍是可能會形成OOM崩潰的狀況,這時候咱們就須要用到分頁,好比說咱們將這10萬條數據分爲1000頁,每一頁100條數據,每一頁加載時都覆蓋掉上一頁中List集合中的內容,而後每一頁內再使用分批加載,這樣用戶的體驗就會相對好一些。