zoukankan      html  css  js  c++  java
  • 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,节省了内存的开销。  

  • 相关阅读:
    Pycharm配置支持vue语法
    HTTP请求方式
    ModelSerializer Meta设置
    Serializer fields
    django-rest-framework配置json web token
    rest_framework_extensions实现缓存
    手把手搭建K3cloud插件开发环境
    Microsoft Visual Studio 2010(vs10)安装与使用
    spring boot mapper层传参数是用main的arg0(第一个参数),arg1(第二个参数)
    spring boot不要放在tomcat下启动,因为自身就带了集成tomcat
  • 原文地址:https://www.cnblogs.com/Sharley/p/5317855.html
Copyright © 2011-2022 走看看