首页 > 代码库 > Android Developers:使ListView滑动流畅

Android Developers:使ListView滑动流畅

流畅滑动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滑动流畅