转载请注明本文出自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. Software Development and Newton&#39;s Laws of Motion

    Software Development and Newton's Laws of Motion Intro I have no idea since when the word velocity f ...

  2. Spring相框

    1.什么是Spring相框?Spring有哪些主要模块框架? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台. Spring帮助开发人员攻克了开发中基础性的问 ...

  3. 用Java写个ftp传输类实现文件的上传和下载,用ikvmc转成dll

    1.Java类: package com.wjy.ftp.transmission; import java.io.File; import java.io.FileOutputStream; imp ...

  4. PHP, Python, Node.js 哪个比较适合写爬虫?

    PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...

  5. Javascript异步数据的同步处理方法

    数据处理方法封装 var DataWatch=(function(){ var gWatch={},cursor= 0,callback_key = 'callback',gMap={}; var c ...

  6. Android网络服务发现(NSD)协议的使用

    Android的网络服务发现协议(NSD)能够用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会很有帮助. Android的NSD的用法大致上分为四种操作: 1. 注 ...

  7. java 常用的包 默认导入的包

    1.java.lang----包含一些Java语言的核心类,如String.Math.Integer.System和Thread,提供常用功能. 2.java.awt----包含了构成抽象窗口工具集( ...

  8. 讨论UML概念和模型UML九种图。

    文件夹: UML的视图 UML的九种图 UML中类间的关系 上文我们介绍了,UML的视图.在每一种视图中都包括一个或多种图. 本文我们重点解说UML每种图的细节问题: 1.用例图(use case d ...

  9. 用EnableMenuItem不能使菜单变灰的原因

    为何不能Disable菜单项     问:我有一个工具button在WM_COMMAND消息是这样做的:         CMenu   *pMenu   =   GetMenu();     pMe ...

  10. Linux通过使用pdb简单调试python计划

    python自带的调试工具库:pdb # -*- coding:utf-8 -*- def func(num): s = num * 10 return s if __name__ == '__mai ...