博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中ListView的优化
阅读量:5996 次
发布时间:2019-06-20

本文共 3387 字,大约阅读时间需要 11 分钟。

第一种方法

  重用了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 text15 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 text18 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,节省了内存的开销。  

     

转载于:https://www.cnblogs.com/Sharley/p/5317855.html

你可能感兴趣的文章
UITabBarController 的使用
查看>>
卡特兰数
查看>>
epoll实现机制分析
查看>>
windows 2008 r2 安装TabsStudio
查看>>
级联分类器训练
查看>>
linux下日语语言包安装
查看>>
Java内存回收 - 落日之心的日志 - 网易博客
查看>>
微软BI 之SSIS 系列 - 导出数据到 Excel 2013 的实现
查看>>
相互独立和互不相融 互拆 对立
查看>>
php 学习路线 赵兴壮2014年4月28 日 加油
查看>>
高精确度且线程分离的定时器——多媒体定时器
查看>>
Linux命令工具基础04 磁盘管理
查看>>
设计模式---建造者模式Builder(创建型)
查看>>
SVG
查看>>
maven web配置发布路径 cargo自动部署项目到tomcat
查看>>
linxu select 返回值
查看>>
代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
Android开发(20)--RadioGroup的使用
查看>>
iphone开发之获取网卡的MAC地址和IP地址
查看>>
【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo...
查看>>