[翻译]android中如何使得ListView滑动流畅

本文翻译的是官网的这篇文章

前言

保证LitView滑动流畅的关键在于:保持应用程序的主线程(既UI线程)不运行复杂的进程。确定任何要硬盘读取、网络读取或者数据库读取的行为在一个独立的线程中进行。你可以激活StrictMode模式来测试你的APP的状态。

1.使用后台线程

使用一个后台线程(工作线程)可以减轻主线程的压力,这样主线程就可以专注UI的绘制。在很多的解决办法中,AsyncTask提供了一种简单的方式实现在主线程之外完成耗时任务。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);

从Android 3.0(API 11)开始,AsyncTask有了一个额外的特性,这个特性使得AsyncTask能够在多处理器内核中运行。用executeOnExecutor()方法替代execute()方法可以在多个内核中同时执行多个请求。

2.用View Holder保存View对象

在滑动ListView的过程中,你的代码可能频繁的调用findViewById(),这降低性能。甚至是在Adapter返回已经填充好了的View的时候,仍然需要找到各个组件并且更新他们。一种循环使用findViewByIdea()的方法是使用“view holder”设计模式。
ViewHolder对象在布局的Tag域中保存每一个组件,因此你可以迅速的访问他们而不需要重复的找到它们。首先创建一个类来保存确切的View集合。例如:

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

现在你可以轻松的读取每一个view,而不需要一个一个查找了,节省有限的处理器周期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值