Android逐条加载ListView,实现动画更新

在Android应用中,如果ListView或是GridView里面的数据比较多的时候,加载会比较费时间,特别是里面有图片的时候,需要花费的时间就更长,这样就会出现一个长时间的等待黑屏界面,这样有时会给用户造成一种错觉,就是这个程序已经“死”了,,,

对于这个问题可以的一个方法是,添加一个ProgressDialog,显示正在处理的窗口,等待加载完之后再关闭这个窗口,

但是这样等所有的数据加载完之后,就是特别突然的显示, 这样用户体验也不佳,

以前看Android优化大师的时候,打开进程管理的时候,它是前面显示正在加载的ProgressDialog,然后也可以看到后台的数据正在逐条加载,这样给人的感觉就好很多,现在就是要做这个效果~~~~

 

主要实现的思路是这样的,新建一个线程,然后在线程里面获取已经安装的程序,再逐条把这些程序(数据)添加到缓冲数组中,再发送一个消息,更新显示ListView的内容,当线程中所有的数据已经加载完的时候,再把ProgressDialog关掉,总的完成效果如下:

程序源代码

    package com.sf.test;
    import java.util.ArrayList;
    import java.util.List;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.KeyEvent;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    /**
     * @author Yao.GUET
     * blog: http://blog.csdn.net/Yao_GUET
     * 实现动态加载一个ListView
     */
    public class ProcessorBarTest extends Activity {
        public static final int MSG_UPDATE_LIST = 18;  

        private ListView mApps;
        private Context mContext;
        private List<String> mAppList;
        private ProgressDialog dialog;  

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.processorbar_test);  

            // ListView 列表 mApps
            mApps = (ListView)findViewById(R.id.lvProcessbar);
            mContext = this;
            mAppList = new ArrayList<String>();  

            // 设置正在处理窗口
            dialog = new ProgressDialog(mContext);
            dialog.setIcon(R.drawable.icon);
            dialog.setTitle("ProgressDialog");
            dialog.setMessage("Please wait while loading application list...");
            dialog.setCancelable(false);
            dialog.show();  

            // 开始动态加载线程
            mThreadLoadApps.start();
        }  

        private Thread mThreadLoadApps = new Thread(){
            @Override
            public void run() {
                int i = 0;
                // TODO Auto-generated method stub  

                // 获取已经安装程序列表
                PackageManager pm = mContext.getPackageManager();
                Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
                mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);  

                // 逐项添加程序,并发送消息更新ListView列表。
                for (i=0; i<list.size(); i++) {
                    mAppList.add(list.get(i).loadLabel(pm).toString());
                    handler.sendEmptyMessage(MSG_UPDATE_LIST);
                }
                // 关闭正在处理窗口
                dialog.dismiss();
            }  

        };  

        private Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                switch (msg.what) {
                case MSG_UPDATE_LIST:
                    // 更新应用程序列表
                    mApps.setAdapter(new ArrayAdapter(mContext,
                            android.R.layout.simple_list_item_1, mAppList));
                    break;
                }
                super.handleMessage(msg);
            }
        };
    }  

后面发现有效率更高的方法,其实不用每次更新一项都需要构建一个Adapter的,,,
把Adapter和一个List<?>绑定在一起之后,可以直接改变List<?>的内容,然后再使用Adapter的数据集更新通知,即可改变ListView的内容,所以后面改了一下源码变成这个样子:

    package com.Yao_GUET.test;
    import java.util.ArrayList;
    import java.util.List;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    /**
     * @author Yao.GUET
     * blog: http://blog.csdn.net/Yao_GUET
     * 实现动态加载一个ListView
     */
    public class ProcessorBarTest extends Activity {
        public static final int MSG_UPDATE_LIST = 18;  

        private ListView mApps;
        private Context mContext;
        private List<String> mAppList;
        private ProgressDialog dialog;
        private ArrayAdapter mAdapter;
        private boolean mIsLoaded = false;  

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.processorbar_test);  

            // ListView 列表 mApps
            mApps = (ListView)findViewById(R.id.lvProcessbar);
            mContext = this;
            mAppList = new ArrayList<String>();
            mAdapter = new ArrayAdapter(mContext,
                    android.R.layout.simple_list_item_1, mAppList);
            mApps.setAdapter(mAdapter);  

            // 设置正在处理窗口
            dialog = new ProgressDialog(mContext);
            dialog.setIcon(R.drawable.icon);
            dialog.setTitle("ProgressDialog");
            dialog.setMessage("Please wait while loading application list...");
            dialog.setCancelable(false);
            dialog.show();  

            // 开始动态加载线程
            mThreadLoadApps.start();  

            mApps.setOnItemClickListener(new AdapterView.OnItemClickListener(){
                public void onItemClick(AdapterView<?> parent, View v, int position,
                        long id) {
                    // TODO Auto-generated method stub
                    mAppList.remove(position);
                    mAdapter.notifyDataSetChanged();
                }  

            });  

            // 获取已经安装程序列表
            PackageManager pm = mContext.getPackageManager();
            Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);  

            // 逐项添加程序,并发送消息更新ListView列表。
            for (int i=0; i<list.size(); i++) {
                mAppList.add(list.get(i).loadLabel(pm).toString());
                mAdapter.notifyDataSetChanged();
            }
            mIsLoaded = true;
        }  

        private Thread mThreadLoadApps = new Thread(){
            @Override
            public void run() {
                int i = 0;
                // TODO Auto-generated method stub
                while (!mIsLoaded) {
                    try {
                        sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // 关闭正在处理窗口
                dialog.dismiss();
            }  

        };
    }  
时间: 2024-08-30 17:32:54

Android逐条加载ListView,实现动画更新的相关文章

Android自定义加载loading view动画组件_Android

在github上找的一个有点酷炫的loading动画https://github.com/Fichardu/CircleProgress  我写写使用步骤  自定义view(CircleProgress )的代码  package com.hysmarthotel.view; import com.hysmarthotel.roomcontrol.R; import com.hysmarthotel.util.EaseInOutCubicInterpolator; import android.

Android自定义加载loading view动画组件

在github上找的一个有点酷炫的loading动画https://github.com/Fichardu/CircleProgress 我写写使用步骤 自定义view(CircleProgress )的代码 package com.hysmarthotel.view; import com.hysmarthotel.roomcontrol.R; import com.hysmarthotel.util.EaseInOutCubicInterpolator; import android.ani

Android 动态加载布局

由于前段时间项目需要,需要在一个页面上加载根据不同的按钮加载不同的布局页面,当时想到用 tabhot .不过美工提供的界面图完全用不上tabhot ,所以想到了动态加载的方法来解决这一需求.在这里我整理了一下,写了一个 DEMO 希望大家以后少走点弯路. 首先,我们先把界面的框架图画出来,示意图如下: 中间白色部门是一个线性布局文件,我喜欢在画图的时候用不同的颜色将一块布局标示出来,方便查看.布局文件代码如下: <?xml version="1.0" encoding="

Android实现Listview异步加载网络图片并动态更新的方法_Android

本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法.分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片.店名.活动详情.地址.电话和距离等. 在布局文件中ListView的定义: <ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width=&qu

Android实现Listview异步加载网络图片并动态更新的方法

本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法.分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片.店名.活动详情.地址.电话和距离等. 在布局文件中ListView的定义: <ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width=&qu

Android自定义加载控件实现数据加载动画_Android

本文实例为大家分享了Android自定义加载控件,第一次小人跑动的加载效果眼前一亮,相比传统的PrograssBar高大上不止一点,于是走起,自定义了控件LoadingView去实现动态效果,可直接在xml中使用,具体实现如下 package com.*****.*****.widget; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.util.

android开发-android 创建同一个布局的多个fragment,加载listview数据不显示或者错乱

问题描述 android 创建同一个布局的多个fragment,加载listview数据不显示或者错乱 如题,我现在就是想做一个仿淘宝的淘抢购那样的功能,我用的是fragment, 因为不确定有多少个页面,所以我根据时间段来创建fragment, fragment里面只有一个listview 布局,首次进去的时候有数据却不显示,而且还加载了上一个页面和一下个页面, 滑动的时候,有时候不显示数据或者数据错乱了. 点击时间段来选中相应的fragment,数据又不显示出来. 这个应该怎么解决啊?

Android编程实现分页加载ListView功能示例

本文实例讲述了Android编程实现分页加载ListView功能.分享给大家供大家参考,具体如下: package eoe.listview; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import andr

fackbook的Fresco (FaceBook推出的Android图片加载库-Fresco)

[Android开发经验]FaceBook推出的Android图片加载库-Fresco   欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件架构设计.测试等文章 原文链接:Introducing Fresco: A new image library for Android 译者 : ZhaoKaiQiang 校对者: Chaossss 校对者: bboyfeiyu 校对者: BillionWang  校对者: dujinyang 校对