当前位置: 首页 > 科技观察

如何让AndroidListView平滑滚动?

时间:2023-03-15 19:03:06 科技观察

使用后台线程使用后台线程(“工作线程”)可以消除主线程的压力,使其可以专注于绘制UI。在许多情况下,使用AsyncTask(异步任务)可以提供一种在主线程之外执行工作的简单方法。AsyncTask自动将所有_execute())请求排队并按顺序执行。此行为对于特定进程是全局的,这意味着您不必担心创建自己的线程池。在下面显示的简单代码中,AsyncTask用于在后台线程中加载图像,然后在完成后将其应用到UI。也可以显示进度条而不是加载图像。//使用AsyncTask在后台线程加载慢速图片newAsyncTask(){privateViewHolderv;@OverrideprotectedBitmapdoInBackground(ViewHolder...params){v=params[0];returnmFakeImageLoader.getImage();}@OverrideprotectedvoidonPostExecute(Bitmapresult){super.onPostExecute(result);if(v.position==position){//如果item没有被回收,隐藏进度条,设置显示图片v.progress.setVisibility(View.GONE);v.icon.setVisibility(View.VISIBLE);v.icon.setImageBitmap(result);}}}.execute(holder);从Android3.0(APILevel11)开始,AsyncTaskfeature中可以使用一个新功能,您可以启用它来跨多个处理器内核交错线程。您可以使用**executeOnExecutor())**方法来同时执行多个请求,而不是调用**execute())**方法,具体取决于可用的核心数。将视图对象保存在ViewHolder中您的代码可能会在滑动ListView时频繁调用findViewById(),这会减慢效果。即使Adapter返回一个显示的视图进行回收,你仍然需要找到元素并更新它们。遍历findViewById()的一种方法是使用“viewholder”设计模式。findViewById())对象存储布局中每个组件视图的标记字段,因此您可以立即访问它,而无需重复查询它们。首先,您需要创建一个类来保存具体视图。例如:staticclassViewHolder{TextViewtext;TextViewtimestamp;ImageViewicon;ProgressBarprogress;intposition;}然后填充findViewById())并将其保存在布局中。ViewHolderholder=newViewHolder();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);现在您可以轻松访问每个视图,而无需频繁查询它们,从而节省了宝贵的处理器周期。