BaseAdapter使用三境界

BaseAdapter(基础适配器):继承它必须实现下面的四个方法

  • 1:public int getCount():适配器中数据集中数据的个数
  • 2:public Object getItem(int i):获取数据集中与指定索引对应的数据项
  • 3:public long getItemId(int i):获取指定行对应的ID
  • 4:public View getView(int i, View view, ViewGroup viewGroup):获取每一个Item的显示内容,这算是最重要的方法

主要点在于getView()方法中,它是将获取数据后的View组件返回.在此方法中优化性能

  • 假设现在有一个简单的listView的简单布局,就一个ImageView与两个TextView
//list_item布局

   
    
    
 

  • ItemBean类
public class ItemBean {   
 public int ItemImageResid;   
 public String Itemtitle;   
 public String ItemContent;   
 /**    
 * 构造方法   
  * @param itemImageResid 图片ID   
  * @param itemtitle 标题    
 * @param itemContent 内容    
 */  
  public ItemBean(int itemImageResid, String itemtitle, String itemContent) {       
   ItemImageResid = itemImageResid;     
   Itemtitle = itemtitle;        
  ItemContent = itemContent;   
 }}
  • 自定义BaseAdapter

第一重境界:初学境界也就是逗逼境界,绝对不要这样子使用,此法子在每次都重新创建创建一个View,完全没有使用到ListView的缓存机制.太浪费

public class MyBaseAdapter extends BaseAdapter {   
 private List mList;  
  private LayoutInflater mInflater;  
  private long mSumTime;   
 public MyBaseAdapter(Context context, List list){      
  mList = list;      
  mInflater = LayoutInflater.from(context); 
   }   
 /**   
  * 数据个数  
   * @return  
   */   
 @Override 
   public int getCount() {  
      return mList.size();  
  }    
@Override    
public Object getItem(int i) {   
     return mList.get(i);  
  }  
  @Override   
 public long getItemId(int i) {  
      return i;  
  }   
 @Override   
 public View getView(int i, View view, ViewGroup viewGroup) {     
  //第一种方式(逗逼式,不建议使用,完全没有利用到ListView的缓存机制,此方法调用非常的频繁) 
View view1 = mInflater.inflate(R.layout.list_item,null);
ImageView icon = (ImageView) view1.findViewById(R.id.list_image);
TextView title = (TextView) view1.findViewById(R.id.list_title);
TextView content = (TextView) view1.findViewById(R.id.list_content);
//模型类
ItemBean bean = mList.get(i);
icon.setImageResource(bean.ItemImageResid);
title.setText(bean.Itemtitle);
content.setText(bean.ItemContent);
return view1;
 }

第二重境界:普通式,加一句判断View是否为空,空则创建,保证了只创建一次,简单利用了缓存机制,但是它View的控件还是每次都使用findViewById来寻找控件,也是非常耗费时间的.这个法子也不最好不要使用,因为还有更好的选择

public View getView(int i, View view, ViewGroup viewGroup) {
//普通式,避免重复创建View,利用了ListView的缓存特性,但是findViewById依然会浪费大量时间
if (view == null){//先判断View是否为空,为空则表示缓存池中无缓存   
 view = mInflater.inflate(R.layout.list_item,null);
}
ImageView icon = (ImageView) view.findViewById(R.id.list_image);
TextView title = (TextView) view.findViewById(R.id.list_title);
TextView content = (TextView) view.findViewById(R.id.list_content);
ItemBean bean = mList.get(i);
icon.setImageResource(bean.ItemImageResid);
title.setText(bean.Itemtitle);
content.setText(bean.ItemContent);
return view;
}

参考文档

第三重境界:也是目前推荐的方法,省去了每次都使用findViewById去寻找控件

/** viewHolder优化BaseAdapter思路
* 1:创建Bean对象,用于封装数据
* 2:在构造方法中初始化用于映射的数据List
* 3:创建viewHolder类,创建布局映射对象
* 4:判断convertView,为空则创建,并设置Tag,通过Tag取出ViewHolder
* 5:给ViewHolder中的控件设置数据
* 总结:不要使用逗逼式,绝对不要使用,绝对不要使用
* */

//内部类,声明我们需要显示的控件,避免重复的findViewById
class viewHolder{   
 public ImageView imageView;   
 public TextView title;  
  public TextView content;
}

public View getView(int i, View view, ViewGroup viewGroup) {
//文艺式:不仅利用了ListView的缓存,更通过ViewHolder类来实现显示数据的视图的缓存,避免多次通过findViewById寻找控件,利用此方法更好点
viewHolder viewHolder;
if (view == null){//判断view是否为空   
 viewHolder = new viewHolder();  
  view = mInflater.inflate(R.layout.list_item,null);    
//将ViewHolder中的控件保存起来   
 viewHolder.imageView = (ImageView) view.findViewById(R.id.list_image);  
  viewHolder.title = (TextView) view.findViewById(R.id.list_title);    viewHolder.content = (TextView) view.findViewById(R.id.list_content);  
  //通过setTag将ViewHolder于view绑定   
 view.setTag(viewHolder);
}else {  
  //通过getTag()取出关联的ViewHolder   
viewHolder = (viewHolder) view.getTag();
}
//赋值
ItemBean bean = mList.get(i);
viewHolder.imageView.setImageResource(bean.ItemImageResid);
viewHolder.title.setText(bean.Itemtitle);
viewHolder.content.setText(bean.ItemContent);
return view;
}
  • Demo

你可能感兴趣的:(BaseAdapter使用三境界)