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

listview

A view that shows items in a vertically scrolling list。

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

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

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

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

第一

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

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


ViewCodepublicViewgetView(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,很大程度上的减少了内存的消耗。

ViewCodepublicViewgetView(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@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){    View view=convertView;    ViewHolder holder;    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;}

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


更多相关文章

  1. 无法将视图添加到相对布局
  2. ListView的上拉弹簧、下拉弹簧,下拉弹簧时动态带刷新和切换换刷新
  3. 在android上滚动时,列表视图的位置会发生变化
  4. 如何在android中的recycler视图中显示第一项的选择?
  5. springMVC使用html视图配置详解
  6. 关于的写法
  7. 自定义视图无法工作,直到我触摸屏幕
  8. 做一个没有视图的零食吧?

随机推荐

  1. android测试
  2. 沉浸式状态栏StatusBar
  3. 常用的一些属性说明
  4. EditText单行显示
  5. Android的四种启动方式
  6. Android中生成xml文件
  7. viewpager实现自动循环轮播图
  8. Android基础知识(二)
  9. Android应用程序与SurfaceFlinger服务之
  10. adb 工具学习