流畅滑动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. 卷积交织/解交织C++程序

    交织基数为M,交织深度为I的卷积交织/解交织程序,延时为I*(I-1)*M. #include <iostream> #include <vector> #include &l ...

  2. 第九章 LinkedBlockingQueue源码解析

    1.对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 Node节点内部类与LinkedBlockingQueue的一些属性 static ...

  3. Trapping Rain Water leetcode java

    题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...

  4. 添加sqljdbc4的maven依赖

    sqljdbc是微软sql server的jdbc驱动 使用sqljdbc需要从微软的官方网站下载jar包: http://www.microsoft.com/en-us/download/detai ...

  5. 【转】Understanding the Angular Boot Process

    原文: https://medium.com/@coderonfleek/understanding-the-angular-boot-process-9a338b06248c ----------- ...

  6. RS交叉表自动汇总后百分比列显示错误之解决方案

    可以说在从事Cognos开发的过程中,仅仅对数据展现而言,大多数用户使用最多的工具便是Report Studio了,此工具可以帮助我们快速的构建一些可供用户自主选择的数据报告.当然我个人认为没有什么开 ...

  7. Linux-cpu分析-vmstat

    转载:https://blog.csdn.net/ty_hf/article/details/63394960 一. 前言 为了更方便的理解本篇内容含义,所以请最好看看如下繁琐的概念,更容易理解. 没 ...

  8. 在Win7上安装MySql5.2遇到Write configuration file的解决

    机器从XP翻新到Win7后,原有的环境也被清除了,因此找了个时间重新安装MySql. 以前轻车熟路的过程,在最后一环却卡住了,出现Write configuration file 错误. 以前从来没有 ...

  9. listView/GridView getChild获取不到的解决方法

    在onCreate或onResume中调用了getChildAt()方法,这时候adapter中的Item还没有放入到AdapterView中去.... 解决方法,当activity获得焦点事件的时候 ...

  10. IP综合

    获取客户端IP的常用方法和注意事项: 进阶一:常用的方法,但是不够严谨. function getIP() { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) ...