Android中ListView的優化問題

                                                                                          
                                                                                                                                                  
                                                                                                                                                  
Adapter的作用是界面與數據之間的橋樑,通過設置適配器至ListView控件後(如調用ListView的 setAdapter(ListAdapter adapter)                              
),列表的每一項會顯示至頁面中。其實,當列表裏的每一項顯示到頁面時,都會調用Adapter的getView方法返回一個View,如:                                 
                @Override                                                                                                                         
                public View getView(int position, View convertView, ViewGroup parent) {                                                           
                        return super.getView(position, convertView, parent);                                                                      
                }                                                                                                                                 
我們看一看下面的這段代碼:                                                                                                                        
public View getView(int position, View convertView, ViewGroup parent) {                                                                           
View newView = mInflater.inflate(R.layout.list_item, null);                                                                                       
((TextView) newView .findViewById(R.id.text)).setText(DATA[position]);                                                                            
((ImageView) newView .findViewById(R.id.icon)).setImageBitmap(                                                                                    
(position & 1) == 1 ? mIcon1 : mIcon2);                                                                                                           
return newView ;                                                                                                                                  
}                                                                                                                                                 
上面的代碼塊中,我通過LayoutInflater.inflate(,)將Layout文件--layout.list_item轉換爲View.                                                          
       (注:Layout也是View的子類,但在android中如果想將xml中的Layout轉換爲View放入.java代碼中操作,只能通過Inflater,而不能通過findViewById())  
這時,如果我的ITEM項有數以千條這樣多或更多呢,再以上面代碼塊的寫法,後果自己想想吧。                                                              
                                                                                                                                                  
    於是,改用其它一種寫法:                                                                                                                      
public View getView(int position, View convertView, ViewGroup parent) {                                                                           
if (convertView == null) {                                                                                                                        
convertView = mInflater.inflate(R.layout.list_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;                                                                                                                                   
}                                                                                                                                                 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章