Android中ListView的优化问题

来源:互联网 发布:华云数据 上市 编辑:程序博客网 时间:2024/05/21 10:37

                                                                                          
                                                                                                                                                  
                                                                                                                                                  
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;                                                                                                                                   
}