这篇文章只是总结下getView里面优化视图的几种写法,就像孔乙己写茴香豆的茴字的几种写法一样,高手勿喷,勿笑,只是拿出来分享,有错误的地方欢迎大家指正,谢谢。

listview

Aviewthatshowsitemsinaverticallyscrollinglist。

一个显示一个垂直的滚动子项的列表视图在android开发中,使用listview的地方很多,用它来展现数据,成一个垂直的视图。使用listview是一个标准的适配器模式,用数据--,界面--xml以及适配器--adapter,数据被适配器按照需要的方式展现出来,xml描写了数据如何展现,activity中控制这些活动。

其中使用自定义的adapter,会要重写getView方法,在getView方法产生给用户item的视图以及数据。

见图:

这里有一个优化的地方,就是重用view,这样减少内存消耗,同时加快item加载速度。

在getView中优化的地方,大家想必都非常情况,下面我总结了三种优化的写法,请大家指正。

第一:

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

特点:如果当前的convertView为null,则通过LayoutInflat产生一个view。

ViewCode

publicViewgetView(intposition,ViewconvertView,ViewGroupparent)

{

if(convertView==null)

{

convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);

}

TextViewtv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);

TextViewtv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);

ContactInfo1confo=contacts.get(position);

if(confo!=null){//toseteveryitem'stext

tv_name.setText(confo.getContactName());

tv_phone.setText(confo.getContact_Phone());

}

returnconvertView;

}

第二:

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

下面给出第二种写法

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

ViewCode

publicViewgetView(intposition,ViewconvertView,ViewGroupparent)

{

ViewHolderholder;

if(convertView==null){

convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);

holder=newViewHolder();

holder.tv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);

holder.tv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);

convertView.setTag(holder);

}

else

{

holder=(ViewHolder)convertView.getTag();

}

ContactInfo1confo=contacts.get(position);

Log.i("my","confo"+confo.getContactName());

if(confo!=null){//toseteveryitem'stext

holder.tv_name.setText(confo.getContactName());

holder.tv_phone.setText(confo.getContact_Phone());

}

returnconvertView;

}

classViewHolder

{

TextViewtv_name,tv_phone;

}

第三:

个人觉得这个写法是最舒服的,最舒服的意思是看着代码有一种很爽,看的很清晰。

特点,使用了内部类classViewHolder、重用了convertView。

区别第二种写法是,使用了一个临时变量Viewview=convertView,然后修改view,最后返回view

ViewCode

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent)

{

Viewview=convertView;

ViewHolderholder;

if(view==null){

view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);

holder=newViewHolder();

holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name);

holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);

view.setTag(holder);

}

else

{

holder=(ViewHolder)view.getTag();

}

ContactInfo1confo=contacts.get(position);

Log.i("my","confo"+confo.getContactName());

if(confo!=null){//toseteveryitem'stext

holder.tv_name.setText(confo.getContactName());

holder.tv_phone.setText(confo.getContact_Phone());

}

returnview;

}

classViewHolder

{

TextViewtv_name,tv_phone;

}

以上就是集中写法,供新手学习和总结。

源代码如下:LisViewTest.zip

根据楼下朋友提供的建议,发现还有优化的地方,最新更新如下:

ViewCode

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent)

{

Viewview=convertView;

ViewHolderholder;

if(view==null){

view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);

holder=newViewHolder();

holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name);

holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);

view.setTag(holder);

}

else

{

holder=(ViewHolder)view.getTag();

}

ContactInfo1confo=contacts.get(position);

Log.i("my","confo"+confo.getContactName());

if(confo!=null){//toseteveryitem'stext

holder.tv_name.setText(confo.getContactName());

holder.tv_phone.setText(confo.getContact_Phone());

}

returnview;

}

staticclassViewHolder

{

TextViewtv_name,tv_phone;

}

注意:staticclassViewHolder

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

非常感谢大家提出建议以及大家的关注!

android 短信列表优化,android listview优化几种写法详细介绍相关推荐

  1. android短信显示内容,Android获取手机短信SMS收件箱内容

    Android中读取的短信方式(短信区域),具体有如下几种方式: /** * 所有的短信 */ public static final String SMS_URI_ALL = "conte ...

  2. android短信功能裁剪,Android短信发送功能实现技巧分享

    如现在启动一模拟器id 号为5554,运行cmd telnet localhost 5554 输入help 可以看到很多用于模拟器中的功能命令 gsm call 134343434   // 便是呼叫 ...

  3. WCF 实例 —— Android 短信助手 (WCF + Android)

    (1)最近开始学习 Android,为了更快上手于是给自己找个小课题来练习一下: WCF作为服务端开放RESTful Service,Android作为客户端将手机上的短信传给服务端显示,并轮询服务端 ...

  4. android短信验证码代码,Android短信验证码自动填写实现代码

    今天给大家分享一个Android短信验证码自动填写的功能.先看下效果图,我发送了一条短信到手机,自动填写验证码.如图: 这个小功能运用到了观察者模式,什么是观察者模式? 观察者模式 :定义对象间的一种 ...

  5. android 短信 字符 执行,Android短信中的特殊字符

    我已经观察了这个问题多年,现在不知道它来自哪里.我担心这个bug在2011年的新版Android中仍然可以观察到,并且我希望如果不解决它,我终于可以帮助我完全理解它.Android短信中的特殊字符 让 ...

  6. android 短信位置,浅析Android手机卫士之手机实现短信指令获取位置

    推荐阅读: 获取位置 新建一个service的包 新建一个GPSService类继承系统的Service类 清单文件中注册一下 重写onCreate()方法,服务创建的时候回调 重写onDestroy ...

  7. android短信验证码方案,Android之短信验证码

    今天所使用的方案只是android手机设备集成短信验证码功能的方案之一. 我们所采用的方案是使用聚合数据的短信验证sdk. 接口文档:https://www.juhe.cn/docs/api/... ...

  8. android短信发送流程,Android 发送短信程序

    [android]代码库mButton1.setOnClickListener(new Button.OnClickListener() { @Override public void onClick ...

  9. android 短信验证计时,Android自定义Chronometer实现短信验证码秒表倒计时功能

    本文实例为大家分享了chronometer实现倒计时功能,android提供了实现按照秒计时的api,供大家参考,具体内容如下 一.自定义chronometerview 继续自textview 主要原 ...

  10. android短信验证码方案,Android开发之属于你的短信验证码(一)

    不飞则已,一飞冲天;不鸣则已,一鸣惊人---------司马迁 最近工作又有新需求,要求用户在注册的时候需要通过手机验证码,这样做的目的是防止用户通过一个邮箱来随便的注册,那么好,今天我们就 一起来学 ...

最新文章

  1. 实用C#编程规范(转载)
  2. 雷死人不偿命-----六年级小学生的字条
  3. python分类算法的应用_Python使用sklearn库实现的各种分类算法简单应用小结
  4. FOJ 1887 景区摊位安排问题
  5. cad文字插件_超好用的4个CAD应用程序,让你提升工作幸福感,裂墙推荐
  6. 在SpringMVC中使用@RequestBody和@ResponseBody注解处理json时,报出HTTP Status 415的解决方案
  7. java实现阴历、阳历互相转换
  8. JS base64 加密和 后台 base64解密(防止中文乱码)
  9. [转] React之Immutable学习记录
  10. CRT 字体颜色设置不生效
  11. .woff2/svg/woff文件报404错误
  12. 股票学习(技术指标--个股贡献度)
  13. Java 中获取Exception的详细信息
  14. mysql leader/followers_half-sync/half-async 和 Leader/Followers 模式的主要区别
  15. Sky Hackthon比赛指北-基础篇
  16. Power and Modulo(思维)
  17. 人工智能相关书籍介绍
  18. 直接杀向3G市场!华为两款新手机曝光
  19. 计算机无法识别ipad2,iTunes无法识别iPad mini怎么办【解决方法】
  20. 有哪些可以用于语文作文中的高级词汇?

热门文章

  1. 在新加坡工作会是一个什么体验
  2. EXCEL 数据比对查询好用的指令——VLOOKUP 三种使用场景
  3. 大数据主要应用于哪些行业,应用价值是什么?
  4. 早上如何泡上一杯质量上佳的柠檬水
  5. 【冷冻电镜入门】加州理工公开课课程笔记 Part 3: Image Formation
  6. 阿里云域名备案域名解析SSL证书申请Nginx代理
  7. Centos 8.5系统优化方案
  8. Mac系统下Typora配置阿里云图床+上传工具PicGo安装
  9. 图表框架html,推荐14个实用的JavaScript图表(JS图表)图形绘制工具
  10. python导入包总是失败