Android Developers:使ListView滑动流畅

本文详细介绍了如何通过使用后台线程和ViewHolder设计来优化ListView的滑动性能,避免UI线程负担,提升用户体验。具体包括使用AsyncTask执行后台任务和在ViewHolder中保存视图组件以加速查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

使用后台线程

————————————————————————————————————————

使用一个后台线程(“工作线程”),从主线程中移除,所以它能专注于绘制UI。在许多情况下,使用AsyTask提供的简单方式,在主线程之外来执行你的工作。AsyncTask自动队列保存所有execute()请求,并连续的执行它们。这个行为对于一个进程是全局的,并且意味着你不需要担心创建你自己的线程池。


在下面的这个示例代码中,AsyncTask是被用于在后台线程中下载图片,然后一旦完成将它们显示到UI中。当它们在下载的时候,它也在图片的位置显示了一个进度条。

// 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);

从Android3.0开始(API level11),在AsyncTask中有一个额外的功能,这么你能启用它来运行在多处理器核心中。替代调用execute()方法,你能调用executeOnExecutor()方法,然后基于可用的核数,多个请求能在同一时间上运行。

在View Holder中保存视图

———————————————————————————————————————

当滑动ListView的时候,你的代码应该会经常调用findViewById()方法,它会减缓性能。即使Adapter返回一个在填充视图循环使用,你一直需要寻找这个元素并更新他们。一种不错的使用findViewById()方法的方式,是使用“view holder”设计模型。

ViewHolder对象存放了布局标记区域的视图组件,所以你能立刻访问它们,不需要重复的寻找它们。首先,你需要创建一个类来保存你需要的视图组。例如:

static class ViewHolder { 
  TextView text; 
  TextView timestamp; 
  ImageView icon; 
  ProgressBar progress; 
  int position; 
} 

然后填充这个ViewHolder,并在这个布局中保存它。

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); 

现在你能快速访问每个视图,不需要查找,节省宝贵的处理器时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值