listview是一个比较重要的UI组件,一切影响UI的操作,比如适配器从磁盘、网络或者数据库中加载数据的操作,最好都放在子线程中完成。子线程可以使用thread,不过那样比较老土,官方推荐使用AsyncTask。

     AsyncTask会自动排队 execute() 任务,并且顺序执行。你的应用进程只需使用它就是了。

    

// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
    // ViewHolder缓存着适配器中每一个convertView上的可视组件
private ViewHolder v; @Override protected Bitmap doInBackground(ViewHolder... params) { v = params[0]; // 以某种方式获取到了bitmap,返回该图片
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 // 每一个converView上的等待提示消失
v.progress.setVisibility(View.GONE); // ImageView可见
v.icon.setVisibility(View.VISIBLE); v.icon.setImageBitmap(result); } } }.execute(holder);

通过ViewHolder,可以避免由于findViewById()带来的性能瓶颈。

static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}
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);

再举个例子,来自于http://blog.csdn.net/fmoonstar/article/details/7748857

当每个ListView的item的converView为空时,将每一个小组件缓存在ViewHolder上,当convertView重复利用时,则取之前已经缓存的小组件,提高ListView的滚动性能。

posted on 2012-12-10 21:47  C语言答疑课堂  阅读(252)  评论(0编辑  收藏  举报