Android中ListView的优化

第一种方法

  重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 特点:如果当前的convertView为null,则通过LayoutInflat产生一个view。

 1 ViewCode 
 2 public View getView(int position, View convertView, ViewGroup parent) { 
 3    if (convertView == null) { 
 4        convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
 5    } 
 6    TextView tv_name = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 
 7    TextView tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
 8    ContactInfo1 confo = contacts.get(position); 
 9    if (confo != null) {//to set every item's text 
10        tv_name.setText(confo.getContactName()); 
11        tv_phone.setText(confo.getContact_Phone()); 
12    } 
13     return convertView; 
14 }

 

上面的写法会有一个缺点,就是每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋值以及事件相应设置。这样其实在做重复的事情,因为的geiview中,其实包含有这些控件,而且这些控件的id还都是一样的,也就是其实只要在view中findViewById一次,后面无需要每次都要findViewById了。 

第二种方法

  1. 第二种写法写发的特点,通常有一个内部类classViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,比如onClick等等,这样可以不用每次都要findViewById了,减少了性能的消耗。同时重用了convertView,很大程度上的减少了内存的消耗。  

     1 public View getView (int position, View convertView, ViewGroup parent) { 
     2     ViewHolder holder; 
     3     if (convertView == null) { 
     4         convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
     5         holder = new ViewHolder(); 
     6         holder.tv_name = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 
     7         holder.tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
     8         convertView.setTag(holder); 
     9      } else { 
    10         holder = (ViewHolder)convertView.getTag(); 
    11      } 
    12      ContactInfo1 confo = contacts.get(position); 
    13      Log.i("my","confo"+confo.getContactName()); 
    14      if (confo != null) {//to set every item's text
    15          holder.tv_name.setText(confo.getContactName()); 
    16          holder.tv_phone.setText(confo.getContact_Phone()); 
    17      } 
    18      return convertView; 
    19 } 
    20 classViewHolder 
    21 { 
    22 TextViewtv_name,tv_phone; 
    23 }

     

    第三种方法

     使用了内部类classViewHolder、重用了convertView。 
    区别第二种写法是,使用了一个临时变量Viewview=convertView,然后修改view,最后返回view 
    复制代码 代码如下:

     

     1 @Override 
     2 public View getView(int position,View convertView,ViewGroup parent) 
     3 { 
     4   View view = convertView; 
     5   ViewHolder holder; 
     6   if (view == null) { 
     7       view = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
     8       holder = newViewHolder(); 
     9       holder.tv_name = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); 
    10       holder.tv_phone = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
    11       view.setTag(holder); 
    12    } else { 
    13       holder = (ViewHolder)view.getTag(); 
    14    } 
    15    ContactInfo confo = contacts.get(position); 
    16    Log.i("my", "confo" + confo.getContactName()); 
    17    if (confo != null) {//to set every item's text
    18        holder.tv_name.setText(confo.getContactName()); 
    19        holder.tv_phone.setText(confo.getContact_Phone()); 
    20    } 
    21     return view; 
    22    } 
    23 static class ViewHolder { 
    24    TextView tv_name, tv_phone; 
    25 }

    这里设置ViewHolder为static,也就是静态的,静态类只会在第一次加载时会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。  

     

posted @ 2016-03-24 23:57  Sharley  阅读(213)  评论(0编辑  收藏  举报