ym——Android之ListView性能优化

时间:2022-12-23 09:49:58

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!



Android之ListView性能优化

假设有看过我写过的15k面试题的朋友们一定知道。ListView的优化方式有下面几种:

  1. 重用了convertView
  2. ViewHolder
  3. static
    class ViewHolder
  4. 在列表里面有图片的情况下,监听滑动不载入图片
以上是大致的说了下面,应付面试已经足够了。假设要使用到项目中,可能有些刚開始学习的人就迷茫了。

接下来我具体的说一下。这个是怎样优化的。

  重用了convertView
getView这种方法会调用的次数是你们的数据条目数*2,重用了convertView,非常大程度上的降低了内存的消耗。通过推断convertView是否为null,是的话就须要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 
特点:假设当前的convertView为null,则通过LayoutInflat产生一个view。 
<span style="font-size:14px;">public View getView(int position,View convertView,ViewGroup parent)
{
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());
}
return convertView;
}</span><span style="font-size: 24px;"> </span>

ViewHolder
上面的写法会有一个缺点,就是每次在getVIew的时候,都须要又一次的findViewById。又一次找到控件,然后进行控件的赋值以及事件对应设置。这样事实上在做反复的事情。由于的geiview中。事实上包括有这些控件,并且这些控件的id还都是一样的,也就是事实上仅仅要在view中findViewById一次,后面无须要每次都要findViewById了。 
以下给出另外一种写法 
写发的特点,通常有一个内部类classViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件对应操作的设置,比方onClick等等,这样能够不用每次都要findViewById了,降低了性能的消耗。同一时候重用了convertView。非常大程度上的降低了内存的消耗。 
<span style="font-size:14px;">public View getView(int position,View convertView,ViewGroup parent)
{
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());
}
return convertView;
}
classViewHolder
{
TextViewtv_name,tv_phone;
} </span>

static class ViewHolder
把以上两种结合起来。然后把ViewHolder为static,也就是静态的,静态类仅仅会在第一次载入时会耗费比較长时间。可是后面就能够非常好帮助载入,
同一时候保证了内存中仅仅有一个ViewHolder,节省了内存的开销。 
我们会发现不管是什么adapter都是这些优化的方式,所以大家肯定思考会没有一种方法能够把代码重用的部分抽出来,
假设有这样的想法的朋友能够看下我写的这篇adapter代码优化
在列表里面有图片的情况下,监听滑动不载入图片
还有一种情况,就是一个列表载入非常多图片,在图片还没载入下来的时候,高速的滑动列表,会发现卡顿的现象发生。
这样的情况我们就须要监听。ListView的滑动监听里面设置不载入图片。滑动停止開始载入。
1、推断listView状态
AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {// ListView
// 触摸事件 public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
} public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 滑动状态
threadFlag = false;
break;
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 停止
threadFlag = true;
startThread();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 触摸listView
threadFlag = false;
break;
default:
// Toast.makeText(contextt, "default",
// Toast.LENGTH_SHORT).show();
break;
}
}
};
2、获取当前屏幕上显示的items:
mListView.getFirstVisiblePosition();
mListView.getLastVisiblePosition();

版权声明:本文博主原创文章,博客,未经同意不得转载。

ym——Android之ListView性能优化的更多相关文章

  1. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  2. Android之ListView性能优化

    ListView滚动速度优化主要可以应用以下几点方法来实现: 1.使用Adapter提供的convertView convertView是Adapter提供的视图缓存机制,当第一次显示数据的时候,ad ...

  3. Android之ListView性能优化——使用ConvertView和ViewHolder

    使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...

  4. Android进阶笔记14:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  5. Android进阶笔记11:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  6. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  7. 【腾讯Bugly干货分享】跨平台 ListView 性能优化

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...

  8. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  9. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

随机推荐

  1. SDWebImage 加载网络图片失败,重新运行,就能加载成功。

    现象: 使用SDWebImage 加载网络图片,偶尔会有一两张图片就是显示不出来.重新运行有时又可以了. 这个问题的原因是: 当SDWebImage 在加载图片的时候 我用的是- (void)sd_s ...

  2. 设置svg图片大小

    background-image: url(/resources/img/liveSupport/tx_1.svg); background-size: 16px 16px; width: 16px; ...

  3. Java面向对象三大特点之继承

    概念: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 生活中的继承: 兔子和羊属于食草动物类,狮子和豹属于食肉动物类 ...

  4. Android异步下载网络图片

    最近新做的一个项目,里面需要下载网络上的图片,并显示在UI界面上,学Android有个常识,就是Android中在主线程中没法直接更新UI的,要想更新UI必须另外开启一个线程来实现,当开启的线程完成图 ...

  5. META 标签的使用

    <meta />标记详解 说明: meta是一个单边标签 ,主要功能:是用于设置或显示一些控制信息,告诉浏览器以什么编码显示. <meta>标记有两个主要的属性: http-e ...

  6. HOMER &vert; MEME &vert; 转录因子的靶基因预测

    Finding Enriched Motifs in Genomic Regions (findMotifsGenome.pl) 在指定区域做motif enrichment,大大降低了假阳性. ME ...

  7. winform的combox下拉框绑定数据源

    List<Site> list = new List<Site>(); foreach (DataRow srcDr in srcDt.Rows) { list.Add(new ...

  8. DB2 substr&comma;instr使用

    看示例,查询下一年'2xxx',例如今年2014,结果为2015 select substr(char(current timestamp),1,4)+1 from SYSIBM.SYSDUMMY1; ...

  9. Mysql浅析-基础命令(一)

    主要从以上篇幅来介绍mysql的一些知识点 一.Mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数 ...

  10. SpringMVC中 Session的使用情况

    在SpringMVC中,使用Session可以用通过两种方式 1.servlet-api 即HttpSession session.setAttritute(),session.getAttribut ...