流畅滑动ListView的关键是保持应用程序的主线程(UI线程)从免于繁重处理。确保你的任何硬盘访问,网络访问或者SQL访问在一个单独的线程中。为了测试你的应用个程序的状态,你能启动StrictMode。

 
使用后台线程 
—————————————————————————————————————————————————————————————— 
使用一个后台线程(“工作线程”),从主线程中移除,所以它能专注于绘制UI。在许多情况下,使用AsyTask提供的简单方式,在主线程之外来执行你的工作。AsyncTask自动队列保存所有execute()请求,并连续的执行它们。这个行为对于一个进程是全局的,并且意味着你不需要担心创建你自己的线程池。 
 
在下面的这个示例代码中,AsyncTask是被用于在后台线程中下载图片,然后一旦完成将它们显示到UI中。当它们在下载的时候,它也在图片的位置显示了一个进度条。 
[java]
// Using an AsyncTask to load the slow images in a background thread   
new AsyncTask<ViewHolder, Void, Bitmap>() {   
    private ViewHolder v;   
    @Override   
    protected Bitmap doInBackground(ViewHolder... params) {   
        v = params[0];   
        return mFakeImageLoader.getImage();   
    }   
    @Override   
    protected void onPostExecute(Bitmap result) {   
        super.onPostExecute(result);   
        if (v.position == position) {   
            // If this item hasn't been recycled already, hide the   
            // progress and set and show the image   
            v.progress.setVisibility(View.GONE);   
            v.icon.setVisibility(View.VISIBLE);   
            v.icon.setImageBitmap(result);   
        }   
    }   
}.execute(holder);<span style="font-family:Arial,sans-serif; font-size:10pt; color:windowtext"> </span>  
Android3.0开始(API level11),在AsyncTask中有一个额外的功能,这么你能启用它来运行在多处理器核心中。替代调用execute()方法,你能调用executeOnExecutor()方法,然后基于可用的核数,多个请求能在同一时间上运行。 
 
在View Holder中保存视图 
——————————————————————————————————————————————————————————————
当滑动ListView的时候,你的代码应该会经常调用findViewById()方法,它会减缓性能。即使Adapter返回一个在填充视图循环使用,你一直需要寻找这个元素并更新他们。一种不错的使用findViewById()方法的方式,是使用“view holder”设计模型。 
 
ViewHolder对象存放了布局标记区域的视图组件,所以你能立刻访问它们,不需要重复的寻找它们。首先,你需要创建一个类来保存你需要的视图组。例如: 
[java] 
static class ViewHolder {   
  TextView text;   
  TextView timestamp;   
  ImageView icon;   
  ProgressBar progress;   
  int position;   
}   
然后填充这个ViewHolder,并在这个布局中保存它。 
[java]
ViewHolder holder = new ViewHolder();   
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);   
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);   
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);   
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);   
convertView.setTag(holder);   
现在你能快速访问每个视图,不需要查找,节省宝贵的处理器时间。

Android Developers:使ListView滑动流畅的更多相关文章

  1. Android -- Toolbar跟随ListView滑动隐藏和显现

    布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  2. Android ScrollView和ListView滑动冲突解决记录

    private int mLastX; private int mLastY; public View.OnTouchListener onTouchListener = new View.OnTou ...

  3. Android开发笔记——ListView模块、缓存及性能

    ListView是Android开发中最常用的组件之一.本文将重点说明如何正确使用ListView,以及使用过程中可能遇到的问题. ListView开发模块 图片缓存 可能遇到的问题 一.ListVi ...

  4. Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画

    前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android An ...

  5. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  6. Android在ListView滑动数据混乱

    我相信做过Android应用程序开发或多或少都遇到了这个问题.或者是在ListView数据损坏幻灯片事件.要么GridView数据损坏幻灯片事件. 让我们来看看一个网友写的文章,个人感觉还不错的文章: ...

  7. 【Android Developers Training】 70. 使用ViewPager实现屏幕滑动

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. Android Widget 开发详解(二) +支持listView滑动的widget

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...

  9. Android 中利用ViewFlipper 滑动屏幕切换页面,ListView展示数据

    首先新建一个Android项目,命名为ViewFlipperTest 如图:项目机构,本项目主要操作图中红色箭头标注的文件 1.HgroupAdapter.java文件代码↓主要实现listview数 ...

随机推荐

  1. ASP.NET—015:ASP.NET中无刷新页面实现

    原文作者:杨友山 原文地址:http://blog.csdn.net/yysyangyangyangshan/article/details/39679823 前面也说过在asp.net中前后前交互的 ...

  2. tomcat怎么运行servlet程序

    新建一个web project 取名 myproject 在myproject 新建一个继承了HttpServlet 的类 MyServlet 重写HttpServlet 的 dopost doget ...

  3. 测试用的数据库Transaction Log太大, 用于缩减它的脚本

    记在这里, 备用. select name, recovery_model_desc from sys.databases where name = 'WSS_Content_1000' USE WS ...

  4. js数组对象深度复制

    var deepCopy = function(o) { if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ...

  5. 两条Find指令

    # 列出所有包括a@b.c内容的xml文件 find / -type f -name "*.xml" | xargs grep "a@b.c" # 列出/opt ...

  6. 使用AKKA做分布式爬虫的思路

    上周公司其它小组在讨论做分布式爬虫,我也思考了一下.提了一个方案,就是使用akka分布式rpc框架来做,自己写master和worker程序,client向master提交begin任务或者其它爬虫需 ...

  7. 翻译记忆软件-塔多思TRADOS经典教程_1

    窗体顶端 网络上关于TRADOS使用的文章很多,但大多数内容涉及的内容都过于广泛,刚准备上手的同行们看了总会觉得不知所云,无从下手.笔者自己也在自学阶段遇到不少麻烦.经过长期的使用和琢磨,终于写了短文 ...

  8. windows下npm默认的全局路径

    C:\Users\用户名\AppData\Roaming\npm\node_modules

  9. Android Gson解析json详解

    目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...

  10. nyoj阶乘之和

     /*阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 给你一个非负数整数n,推断n是不是一些数(这些数不同意反复使用,且为正数)的阶乘之和, 如9=1! ...