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

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

时间: 2024-10-11 06:25:57

Android Developers:使ListView滑动流畅的相关文章

Android Toolbar跟随ListView滑动隐藏和现实

使用过Google Play Store应用或者Google+应用的人都知道,其ActionBar能随着ListView的滑动而相应的隐藏或者显示.效果看起来很不错,为此,我笨拙的模仿了一个类似的效果,不知道有没有更好的办法. 先上主布局activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.

Android -- Toolbar跟随ListView滑动隐藏和显现

布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <ListVi

[android]完美解决ListView加载网络图片乱跳问题

为什么 先说一下为什么会出现图片乱跳. 使用convertView对ListView的每个item优化,item的复用可以有效降低内存的占用,使ListView滑动更为流畅.但会带来一个问题,当最顶部的item滑出屏幕时,会变成下一个从底部将要滑进来的item.每次滑进来的item都要去请求网络获得图片. 第一个item滑出去时,是带着图片的.其ImageView指向了一块内存.当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(只有一半在屏幕里能看到了)的还是指向 同一块内存.加载的了同一张

Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很好滚动流畅是做不到的 所以这里就需要把这些信息利用多线程实现异步加载 实现这样功能的类 [java] view plaincopy public class AsyncImageLoader { private HashMap<String, SoftReference<Drawable>&

Android ListView滑动删除及响应事件详解

目标:实现类似QQ,微信的消息列表滑动删除 具体操作: 1. 主页面布局 首先在布局文件(本例是activity_main.xml)中引入ListView控件,并指定id(如下代码中黑体部分). <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" andr

Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画

前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android Animation动画详解(二): 组合动画特效 . 已经熟悉了基础动画的实现后,便可以试着去实现常见APP中出现过的那些精美的动画.今天我主要给大家引入一个APP的ListView的动画效果: 当展示ListView时,Listview的每一个列表项都按照规定的动画显示出来. 说起来比较抽象,先给大家

Android ListView滑动过程中控件显示重复/错误问题之原理分析及解决方案

前言: 为了使ListView性能更优,最普遍的方法就是添加一个ViewHolder静态类. 虽然性能有很大的提高,但是同样也伴随着Item控件内容显示重复或错乱的情况. 分析并解决如下两个问题 一.控件数据未初始化而导致的显示错误. 二.网络异步加载导致出现显示错误.重复. 如下我们来简单分析一下ListView的缓存机制.我们整篇文章均以下图的模型来举例说明. (图片转至http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.h

Android 结合滑动控件ListView滑动删除

一转眼就15年了,希望大家15年升职加薪走上人生巅峰 这篇博客是结合上一篇ListView滑动删除之Viewgroup打造滑动控件(修正版)博客所完成的,先上个效果图吧. 其实实现起来并不复杂 1,解决滑动冲突 因为我们的自定义滑动控件和ListView本身的滑动事件会产生各种冲突,所以我们可以自定义ListView并重写onInterceptTouchEvent方法. 我们先来了解一下android事件的分发,当用户触摸屏幕时会先去调用ViewGroup的dispatchTouchEvent方

Android 监听ListView、GridView滑动到底部

// 监听listview滚到最底部mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (view.get